c - 动态分配结构体数组C编程

标签 c arrays struct

嗨,所以我尝试使用 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/

相关文章:

c - 声明和定义相互引用的初始化常量结构的最佳方法

c - 如何修剪该数组中的空格(右侧)?

c++ - 如何在 MFC 中使用 WriteConsoleInput()?

javascript - 在 React setState 中使用变量将元素从一个数组移动到另一个数组?

c - 链表,以错误的顺序存储?

c - 修改服务器,使其仅监听环回接口(interface)

arrays - 将.Find()函数结果保存到数组Excel VBA

java - 选择一个随机索引,然后从该索引获取属性(Jmeter)

c - 解码偏移宏

c - 内存并在共享内存中的指针中传递值