嗨,所以我尝试使用 calloc 来分配指向结构的指针数组,如下所示,但在我尝试将数组中的一个指针分配给也是动态分配的结构的行中,我有麻烦了。
struct node
{
int c;
};
typedef struct node Node;
int main(void)
{
int i;
int **ptrArr;
int intArr[NUM] = {1, 2, 3, 4, 5};
Node *ptr;
*ptrArr = calloc (NUM, sizeof(Node *));
for (i=0; i<NUM; i++) {
ptrArr[i] = calloc (NUM, sizeof(Node *));
}
for (i=0; i<NUM; i++) {
ptr = calloc (1, sizeof(Node));
(*ptr).c = intArr[i];
ptrArr[i] = ptr; /*line with the compiler issue*/
}
return 0;
}
最佳答案
首先,ptrArr
类型需要为 Node **
,而不是 int **
:
Node **ptrArr = NULL;
那么实际的分配将是:
ptrArr = calloc( NUM, sizeof *ptrArr );
if ( ptrArr )
{
for ( size_t i = 0; i < NUM; i++ )
ptrArr[i] = malloc( sizeof *ptrArr[i] );
}
由于ptrArr
的类型为Node **
,那么*ptrArr
的类型为Node *
,因此 sizeof *ptrArr
相当于 sizeof (Node *)
,而 sizeof *ptrArr[i]
相当于 sizeof (节点)
。一般来说,
T *p = calloc( NUM, sizeof *p );
或
T *p = malloc( NUM * sizeof *p );
对于任何类型T
总是会做正确的事情。
编辑
您正在造成内存泄漏 - 您为每个 ptrArr[i]
分配内存,然后为 ptr
分配内存并覆盖 ptrArr[i] 的先前值,丢失对先前分配的内存的引用。您不需要创建单独的 ptr
对象;就这样写
ptrArr[i]->c = intArr[i];
关于c - 动态分配结构体数组C编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089444/