我对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;
}
当我从create_new_list()
函数调用main()
时,我得到:
“分段错误。核心转储已创建”。
int main()
{
list_t * my_list = create_new_list();
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
您的问题是您永远不会为新列表分配任何内存。因此
´new_list->head = ... `
会崩溃。
尝试:
list_t * create_new_list()
{
list_t * new_list = malloc(sizeof *new_list); // Allocate a new list
if (!new_list) exit(1); // Bail out if it failed
new_list->head = NULL; // Initialize pointers
new_list->tail = NULL; // Initialize pointers
return new_list; // Return the new list
}
不要在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
}
答案 1 :(得分:3)
list_t * new_list;
new_list->head = malloc( sizeof(node_t) );
由于new_list
没有价值,所以这不会奏效!你也需要为它分配内存。尝试这样做
list_t * new_list = malloc(sizeof(list_t));