我目前正在尝试做一些简单的事情,将节点列表转换为指向节点的指针数组,以便可以将其用于其他功能。
typedef struct {
int data;
} myNode;
在试图创建节点指针数组的函数中,我编写了类似的内容(假设我有一个名为myList的所有节点的列表):
myNode** aryPtr = malloc(sizeof(myNode*)) * numItemsInList);
为每个位置,我为指针分配内存:
int inc = 0;
int z = 0;
aryPtr[inc] = malloc(sizeof(myNode));
aryPtr[inc] = &(myList[z]);
inc += 1;
z += 1;
我一直在尝试执行类似的操作,以将指向每个节点的指针存储在数组中,但是还没有成功,也不完全了解如何制作指针数组(使用a双指针)。任何有关如何将指针存储到动态分配的指针数组中的帮助都将大有帮助。
答案 0 :(得分:4)
这两行有点问题:
aryPtr[inc] = malloc(sizeof(myNode));
aryPtr[inc] = &(myList[z]);
第一次分配
aryPtr[inc] = malloc(sizeof(myNode));
分配内存,并使aryPtr[inc]
指向该内存。但是下一次作业
aryPtr[inc] = &(myList[z]);
丢弃malloc
调用的结果,然后重新分配aryPtr[inc]
指向其他位置。这会导致内存泄漏。
这类似于拥有一个简单的int变量,并多次分配它:
int a;
a = 5;
a = 10;
然后想知道为什么a
不等于5
。
要解决此问题,请用malloc
删除第一个作业,而只能使用
aryPtr[inc] = &myList[z]; // Make aryPtr[inc] point to myList[z]
或取消引用目标指针以复制结构:
aryPtr[inc] = malloc(sizeof(myNode));
*aryPtr[inc] = myList[z]; // Copy the structure itself
另外两件事:
使用显示的代码(您确实需要提供正确的Minimal, Complete, and Verifiable Example),看来您总是在0
和aryPtr
上都使用索引myList
。您同时为aryPtr
和myList
使用相同的索引,因此您只需要一个变量。