gpt4 book ai didi

c - 为C中的链表中的新元素分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:41 30 4
gpt4 key购买 nike

我正在尝试创建一个链表,我已经让它工作了,但我还是有点困惑。我正在使用以下结构:

typedef struct _MList
{
int dx;
int dy;
struct _MList *next;
} MList_t, *MList_p;

我已经测试过这个结构是有意义的,并且我有一个打印列表的函数:

void mListPrint(MList_t *mList)
{
MList_p node = mList;
while (node->next != NULL)
{
printf("[%i,%i] ",node->dx,node->dy);
node = node->next;
}
printf("[%i,%i]\n",node->dx,node->dy);
}

以及创建第一个节点的函数:

MList_t mListNew(int dx, int dy)
{
MList_t newNode;
newNode.dx = dx;
newNode.dy = dy;
newNode.next = NULL;
return newNode;
}

有了这个工作正常,我想我会尝试创建一个函数,在列表的末尾添加一个节点。我的第一次尝试是这样的:

void mListAdd(int dx, int dy, MList_t *mList)
{
MList_p node = mList;

while (node->next != NULL)
{
node = node->next;
}

MList_t newNode = mListNew(dx,dy);
node->next = &newNode;
}

这看起来不错,直到我添加了不止一个元素。经过多次调试后发现,在 mListAdd 中创建的“newNode”的内存地址始终相同。因此列表最终链接回自身。这是为什么?

我改为使用指向新节点的指针来实现 mListAdd,如下所示:

void mListAdd(int dx, int dy, MList_t *mList)
{
MList_p node = mList;

while (node->next != NULL)
{
node = node->next;
}
MList_p newNode = malloc(sizeof(MList_t));
*newNode = mListNew(dx,dy);
mListPrint(newNode);
node->next = newNode;
}

这非常有效,但我觉得其他方法也应该有效。还是我错过了一些明显的东西?我正在尝试通过实现我在 Java 和 ML 中学到的不同数据结构来学习 C 语言以进行面试。

我对代码量感到抱歉,但我认为最好尽可能彻底地解释我的问题。提前感谢您的帮助!

最佳答案

mListNew 中你使用了一个局部变量:

MList_t newNode;

一旦您从函数返回,这就会超出范围。所以你在未定义的领域。代码看起来好像只是因为内存管理器没有覆盖该局部变量占用的内存块而起作用。

您应该在 mListNew 中使用 malloc 分配新的列表节点,并返回指向新节点的指针,如下所示:

MList_p mListNew(int dx, int dy)
{
MList_p newNode = malloc(sizeof(MList_t));
newNode->dx = dx;
newNode->dy = dy;
newNode->next = NULL;
return newNode;
}

关于c - 为C中的链表中的新元素分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2251385/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com