尝试使用动态内存分配创建节点指针数组

Posted

技术标签:

【中文标题】尝试使用动态内存分配创建节点指针数组【英文标题】:Trying to create an array of node pointers using dynamic memory allocation 【发布时间】:2019-02-12 08:18:05 【问题描述】:

我目前正在尝试做一些简单的事情,将我的节点列表转换为指向节点的指针数组,以便我可以将其用于其他功能。

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;

我一直在尝试做这样的事情来将指向我的每个节点的指针存储在一个数组中,但是没有成功并且不完全理解如何创建一个指针数组(使用双指针)。关于如何将指针存储到动态分配的指针数组中的任何帮助都会有很大帮助。

【问题讨论】:

myNode** aryPtr = malloc(sizeof(myNode*)) * numItemsInList);malloc 返回的指针乘以numItemsInList——这不是你想要的。 myNode **aryPtr = malloc (sizeof *aryPtr * numItemsInList); 将分配 numItemsInList 指针,然后您可以分配一个节点并为每个节点分配地址。 请发布实际代码,而不是您刚才写下的内容。 【参考方案1】:

这两行有点问题:

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),您似乎总是对aryPtrmyList 使用索引0。您还对aryPtrmyList 使用相同的索引,因此您只需要一个变量即可。

【讨论】:

有道理!谢谢,我还想要一个指针数组,取消引用它不会让我得到实际值而不是对指针的实际引用吗?我该怎么做呢 @FlyinProgrammer 考虑到您使用 &(myList[z]) 表示 myList[z] 是结构的一个实例。通过使用*aryPtr[inc] = myList[z],您将复制该结构。它类似于myNode myStructure; myStructure = myList[z];。当然,这需要您保留malloc 呼叫。

以上是关于尝试使用动态内存分配创建节点指针数组的主要内容,如果未能解决你的问题,请参考以下文章

4-数组指针与字符串1.4-动态内存分配

如何正确地为字符串“数组”动态分配内存

内存的动态分配(指针数组)

C和C指针小记(十六)-动态内存分配

我可以删除以前动态分配但使用不同指针的内存吗?

静态链表和动态链表的区别