编写链表实现时C指针出现问题
最近我又回到了C语言编程领域,我正在写的链表实现有一些问题 以下是我的结构定义:编写链表实现时C指针出现问题,c,pointers,C,Pointers,最近我又回到了C语言编程领域,我正在写的链表实现有一些问题 以下是我的结构定义: typedef struct linked_list_entry { struct linked_list_entry *next; struct linked_list_entry *prev; void* data; } linked_list_entry; typedef struct linked_list { uint32 count; struct linked
typedef struct linked_list_entry {
struct linked_list_entry *next;
struct linked_list_entry *prev;
void* data;
} linked_list_entry;
typedef struct linked_list {
uint32 count;
struct linked_list_entry *first;
struct linked_list_entry *last;
} linked_list;
下面是有问题的代码:
int linked_list_add_entry(linked_list** linked_list, void* data)
{
linked_list_entry* new = malloc(sizeof(linked_list_entry));
...
DPRINT("last(%p), new (%p)\n", (*linked_list)->last, new);
(*linked_list)->last->next = new;
DPRINT("(*linked_list)->last(%p)->next (%p)\n", (*linked_list)->last, (*linked_list)->last->next);
使用调试输出:
data-types/linked-list.c:37:linked_list_add_entry(): last(0x7fa497402790), new (0x7fa4974027b0)
data-types/linked-list.c:39:linked_list_add_entry(): (*linked_list)->last(0x7fa4974027b0)->next (0x0)
知道为什么最后一个指针变为new,而新指针变为NULL
谢谢答案是我在使用malloc时需要使用struct关键字:
linked_list_entry* new = malloc(sizeof(struct linked_list_entry));
您提供的转储显示,
(*linked_list)->last
的值在您更改后发生了更改
(*linked_list)->last->next = new;
但这一行代码不会更改最后一行(至少,它不应该更改)
对这种“神奇”行为的可能解释包括
**链接列表未正确分配。为其分配的内存太少
**链接列表
对象。因此,*(*链接列表)->last
恰好与**链接列表的内存位置重叠。这就是为什么上面的作业似乎也会更改(*链接列表)->last
。即,由于上述指针问题,(*链接列表)->last
和(*链接列表)->last->next
在内存中占据相同的位置
例如,当为对象分配的内存量不正确(不足)时,可能会发生类似的情况。在这种情况下,问题在于调用代码。它提供一个“断开的”列表作为输入
调用代码如何为链表本身分配内存?请注意,在此函数中,您对函数参数使用了namelinked_list
,从而隐藏了类型linked_list
的名称。如果在“other”函数中执行类似操作,即分配linked\u list
对象本身的函数,那么尝试在其中使用sizeof(linked\u list)
将返回不正确的值(指针的大小而不是结构类型的侧面)。这可以解释内存分配不足的原因
(*链接列表)->last
不是正确初始化的指针。它指向一些不可预测的位置。因此,*(*链表)->last
恰好与**链表等的内存位置重叠(见上文)
新的不是一个保留词吗?@ MaojjkMuraRaI,<代码> NeX/COD>不是C.中的保留词,你与C++混淆。<代码> *Link KEdList< /Co>指针的值是什么?将其添加到转储。如何为链接列表分配内存。。。为什么?
linked\u list\u entry
本身就是一个完全有效的类型名。这与您显示的代码没有任何区别。可能您正在运行另一个版本的代码?确实如此,请参阅我刚才编写的以下测试:printf(“%d vs%d\n”、sizeof(linked_list)、sizeof(struct linked_list));8对24真奇怪@Jason您的评论的结果是因为您声明了一个局部变量linked\u list
(一个指针,8个字节),它隐藏了全局类型名linked\u list
。@Jason:sizeof(linked\u list)与您发布的代码有什么关系?您发布的代码既不使用sizeof(链接列表)
也不使用sizeof(结构链接列表)
。