Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写链表实现时C指针出现问题_C_Pointers - Fatal编程技术网

编写链表实现时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

最近我又回到了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_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
    在内存中占据相同的位置

    例如,当为对象分配的内存量不正确(不足)时,可能会发生类似的情况。在这种情况下,问题在于调用代码。它提供一个“断开的”列表作为输入

    调用代码如何为链表本身分配内存?请注意,在此函数中,您对函数参数使用了name
    linked_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(结构链接列表)