gpt4 book ai didi

c - 试图清空链表

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:25 24 4
gpt4 key购买 nike

我试图遍历我的链接列表并释放该列表中的所有节点。

该函数应该做的:

应该在栈中释放与链表中每个节点关联的空间,但不应释放内存中与栈结构关联的空间,而是应该将头指针设置为NULL。

这些是我的结构:

typedef struct nodeT {
valueT value;
struct nodeT* next;
} node;
typedef struct {
node* head;
} stack;

这是我遇到问题的函数:

void ClearStack(stack* s) {
while ( s ) {
node* temp = s->head->next;
free(temp);
}

free(s);
}

s 内部有 7 个节点。程序在第二个循环中崩溃,我不知道出了什么问题。

最佳答案

让我们逐步了解代码的作用。假设我们从这个列表开始:

a = { .value = 42, .next = &b }
b = { .value = 0, .next = NULL }
lst = { .head = &a };

我们假设 a 在内存 0x8000,b 在内存 0x8008,lst 在内存 0x8010,只是为了获取指针的一些具体值。现在我们调用 ClearStack(&lst)。

while (s)                    # s is 0x8010, so this is true

node *temp = s->head->next; # temp is now 0x8008 (&b).

free(temp); # We free the memory. temp is still 0x8008, but you don't
# own that memory anymore.

while (s) # back to the top of the loop. s is still 0x8010. still true.

node *temp = s->head->next; # temp is assigned to 0x8008 (&b) again.

free(temp); # You already freed that memory; freeing memory you don't
# own is undefined. The program is likely to crash here (*)

你永远不会改变 s 或 s->head,所以程序只是一遍又一遍地循环遍历列表中的第一个元素,直到它崩溃。

(*) 虽然不一定要崩溃;未定义的行为意味着它可以做任何,包括按您预期的方式工作一段时间,只是让您的头脑困惑。

关于c - 试图清空链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828232/

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