在 C 中动态创建和初始化指向结构的指针数组
Dynamically create and initialize an array of pointers to struct in C
这是我要实现的示例代码
typedef struct
{
int x_pos, y_pos;
} A;
typedef struct
{
A **arrayAp;
} B;
int main(void) {
B B;
int n = 10;
A *array[n];
B.arrayAp = array;
for (int i = 0; i < 10; i++)
{
B.arrayAp[i] = malloc(sizeof(A));
B.arrayAp[i]->x_pos = i;
B.arrayAp[i]->y_pos = i + 1;
}
printf("%d",B.arrayAp[0]->x_pos);
}
它按我希望的那样工作。我可以使用 "arrayAp" 指针访问 "array" 的元素。但是当我尝试移动一些代码来运行时,例如:
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
然后将returns赋值给"arrayAp"
B.arrayAp = makeAnArray();
现在我无法访问数组的第一个元素。程序刚刚崩溃。
printf("%d",B.arrayAp[0]->x_pos);
但是从第二个元素开始,一切都一样。
但是当我尝试移动以运行此代码时遇到的更大问题:
void initializeAnArray(B *B)
{
for (int i = 0; i < 10; i++)
{
B->arrayAp[i] = malloc(sizeof(A));
B->arrayAp[i]->x_pos = i;
B->arrayAp[i]->y_pos = i + 1;
}
}
好像没有效果。当我尝试通过 "arrayAp" 指针访问数组成员时,我从内存中获取了一些 "random" 值。
typedef struct
{
int x_pos, y_pos;
} A;
typedef struct
{
A **arrayAp;
} B;
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
void initializeAnArray(B *B)
{
for (int i = 0; i < 10; i++)
{
B->arrayAp[i] = malloc(sizeof(A));
B->arrayAp[i]->x_pos = i;
B->arrayAp[i]->y_pos = i + 1;
}
}
int main(void) {
B B;
B.arrayAp = makeAnArray();
initializeAnArray(&B);
printf("%d",B.arrayAp[1]->x_pos);
}
抱歉我的英语不好。
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
您正在 return 本地指针,该指针在函数结束后死亡并导致 UB。
此外,你的函数的 return 类型应该是 A**
并且你应该使用 *alloc
和 return 分配内存以确保每个实例都是不同的并且在函数调用。
可能的修复
A * makeAnArray()
{
int n = 10;
A *array = malloc(n * sizeof(A));
return array;
}
部分
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
行不通。数组array
可能分配在堆栈上,在makeAnArray
终止后无法通过return值访问它;结果是未定义的行为。
你的函数应该是:
A * makeAnArray()
{
int n = 10;
//A *array[n]; --> This is local to this function so won't work
A *array = malloc(sizeof(A)*n); //--> Dynamic allocation
return array;
}
这是我要实现的示例代码
typedef struct
{
int x_pos, y_pos;
} A;
typedef struct
{
A **arrayAp;
} B;
int main(void) {
B B;
int n = 10;
A *array[n];
B.arrayAp = array;
for (int i = 0; i < 10; i++)
{
B.arrayAp[i] = malloc(sizeof(A));
B.arrayAp[i]->x_pos = i;
B.arrayAp[i]->y_pos = i + 1;
}
printf("%d",B.arrayAp[0]->x_pos);
}
它按我希望的那样工作。我可以使用 "arrayAp" 指针访问 "array" 的元素。但是当我尝试移动一些代码来运行时,例如:
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
然后将returns赋值给"arrayAp"
B.arrayAp = makeAnArray();
现在我无法访问数组的第一个元素。程序刚刚崩溃。
printf("%d",B.arrayAp[0]->x_pos);
但是从第二个元素开始,一切都一样。
但是当我尝试移动以运行此代码时遇到的更大问题:
void initializeAnArray(B *B)
{
for (int i = 0; i < 10; i++)
{
B->arrayAp[i] = malloc(sizeof(A));
B->arrayAp[i]->x_pos = i;
B->arrayAp[i]->y_pos = i + 1;
}
}
好像没有效果。当我尝试通过 "arrayAp" 指针访问数组成员时,我从内存中获取了一些 "random" 值。
typedef struct
{
int x_pos, y_pos;
} A;
typedef struct
{
A **arrayAp;
} B;
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
void initializeAnArray(B *B)
{
for (int i = 0; i < 10; i++)
{
B->arrayAp[i] = malloc(sizeof(A));
B->arrayAp[i]->x_pos = i;
B->arrayAp[i]->y_pos = i + 1;
}
}
int main(void) {
B B;
B.arrayAp = makeAnArray();
initializeAnArray(&B);
printf("%d",B.arrayAp[1]->x_pos);
}
抱歉我的英语不好。
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
您正在 return 本地指针,该指针在函数结束后死亡并导致 UB。
此外,你的函数的 return 类型应该是 A**
并且你应该使用 *alloc
和 return 分配内存以确保每个实例都是不同的并且在函数调用。
可能的修复
A * makeAnArray()
{
int n = 10;
A *array = malloc(n * sizeof(A));
return array;
}
部分
A * makeAnArray()
{
int n = 10;
A *array[n];
return &array;
}
行不通。数组array
可能分配在堆栈上,在makeAnArray
终止后无法通过return值访问它;结果是未定义的行为。
你的函数应该是:
A * makeAnArray()
{
int n = 10;
//A *array[n]; --> This is local to this function so won't work
A *array = malloc(sizeof(A)*n); //--> Dynamic allocation
return array;
}