C 如何引用嵌套结构中的指针?
我对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
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指向的部分。你们的答案更完整。就这样