Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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_Linked List_Typedef - Fatal编程技术网

C 如何引用嵌套结构中的指针?

C 如何引用嵌套结构中的指针?,c,pointers,linked-list,typedef,C,Pointers,Linked List,Typedef,我对C指针还比较陌生,所以我试着和它们一起玩,更深入地了解它们是如何工作的。 我有以下数据类型,用typedef定义: struct node { int key; struct node * prev; struct node * next; }; typedef struct node node_t; struct list { node_t * head; node_t * tail; }; typedef struct list list_t

我对C指针还比较陌生,所以我试着和它们一起玩,更深入地了解它们是如何工作的。 我有以下数据类型,用
typedef
定义:

struct node
{
    int key;
    struct node * prev;
    struct node * next;
};

typedef struct node node_t;

struct list
{
    node_t * head;
    node_t * tail;
};

typedef struct list list_t;
我的目标是创建一个双链接列表,指针指向其头部和尾部,可能
tail->next
指向头部;为了有一个循环列表。 问题是,每当我试图引用节点的任何指针时,就会出现分段错误。 我编写了如下函数:

list_t * create_new_list()
{
    list_t * new_list;
    new_list->head = malloc( sizeof(node_t) );
    new_list->tail = malloc( sizeof(node_t) );

    // I've also tried
    // list * new_list = malloc( sizeof(list_t) );
    // but it doesn't work */


    /* init the head node */
    new_list->head->prev = NULL;
    new_list->head->next = NULL;
    new_list->head->key = 0;

    /* init the tail node */
    new_list->tail->prev = NULL;
    new_list->tail->next = NULL;
    new_list->tail->key = 0;

    return new_list;
}
当我从我的
main()
函数调用
create\u new\u list()
时,我得到: “分段错误。已创建堆芯转储”


您的问题是,您从未为新列表分配任何内存。因此

´new_list->head = ... `
将会崩溃

尝试:

不要在
create
功能中分配任何节点。在
insert
函数中执行此操作

比如:

void insert(list_t *list, int key)
{
    node_t* new_node = malloc( sizeof *new_node );
    if (!new_node) exit(1);                        
    new_node->key = key;

    //... add the code to insert the node into the list
}

您的问题是,您从未为新列表分配任何内存。因此

´new_list->head = ... `
将会崩溃

尝试:

不要在
create
功能中分配任何节点。在
insert
函数中执行此操作

比如:

void insert(list_t *list, int key)
{
    node_t* new_node = malloc( sizeof *new_node );
    if (!new_node) exit(1);                        
    new_node->key = key;

    //... add the code to insert the node into the list
}
这不起作用,因为
新列表
没有值!您还需要为它分配内存。试着这样做

list_t * new_list = malloc(sizeof(list_t));
这不起作用,因为
新列表
没有值!您还需要为它分配内存。试着这样做

list_t * new_list = malloc(sizeof(list_t));


那你为什么不检查一下堆芯转储呢?它是不是圆形的差别很大。请说明您想要什么。您在哪里试用过您的
malloc
?您首先需要
malloc
您的新列表,然后是您的头部和尾部。您无法取消对不存在的列表的引用。请注意,空列表的
节点未连接。这是故意的吗?我想你希望
create_new_list
head
tail
都设为null,然后当你实际将第一个元素添加到列表中时,它们都将指向这一个元素(毕竟是tail和head)。或者,如果您想要sentinel tail和head元素(因此空列表有2个“假”元素,虽然不常见,但有时可能有意义),则应相应地初始化它们的
next
/
prev/
。未显示嵌套的
结构。指针不是它指向的对象!那你为什么不检查一下堆芯转储呢?它是不是圆形的差别很大。请说明您想要什么。您在哪里试用过您的
malloc
?您首先需要
malloc
您的新列表,然后是您的头部和尾部。您无法取消对不存在的列表的引用。请注意,空列表的
节点未连接。这是故意的吗?我想你希望
create_new_list
head
tail
都设为null,然后当你实际将第一个元素添加到列表中时,它们都将指向这一个元素(毕竟是tail和head)。或者,如果您想要sentinel tail和head元素(因此空列表有2个“假”元素,虽然不常见,但有时可能有意义),则应相应地初始化它们的
next
/
prev/
。未显示嵌套的
结构。指针不是它指向的对象!谢谢成功了!克里斯调谐器的解决方案也在发挥作用。我标记这个是因为它是第一个one@brainplot我的回答解决了您的问题所涉及的直接问题,但没有解决您的问题所涉及的其他问题code@ChrisTurner什么意思?我的代码没有显示任何特殊或特别错误,我认为,除了尝试初始化同一函数中的节点外:/@ChrisTurner-是的,您的答案也是正确的。我确信OP给了你和投票权——就像我一样。@4386427我真的给了!另外,我认为传递结构名(node_t)作为sizeof参数看起来更整洁(也更可读),而不是传递new_node指向的部分。你们的答案更完整。那是汉克斯!成功了!克里斯调谐器的解决方案也在发挥作用。我标记这个是因为它是第一个one@brainplot我的回答解决了您的问题所涉及的直接问题,但没有解决您的问题所涉及的其他问题code@ChrisTurner什么意思?我的代码没有显示任何特殊或特别错误,我认为,除了尝试初始化同一函数中的节点外:/@ChrisTurner-是的,您的答案也是正确的。我确信OP给了你和投票权——就像我一样。@4386427我真的给了!另外,我认为传递结构名(node_t)作为sizeof参数看起来更整洁(也更可读),而不是传递new_node指向的部分。你们的答案更完整。就这样