我正在学习 C 语言中的链接列表概念,因为我正在构建一个可以创建单个逆序列表的项目,我遇到了一次又一次转储的分段代码。请帮我找出错误
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node *next;
}node;
node* createll(node *head, node *error);
void print_list(node *head);
int main(void){
node *head = NULL;
node *error = NULL;
error->num = 1;
error->next = NULL;
head = createll(head, error);
print_list(head);
return 0;
}
node* createll(node *head, node *error){
int len;
printf("Size of list: ");
scanf("%d", &len);
for (int i = 0; i < len; i++) {
node *new_node = malloc(sizeof(node));
if (new_node == NULL) {
return error;
}
printf("Enter the data: ");
scanf("%d", &new_node->num);
new_node->next = NULL;
new_node = head;
head = new_node;
}
return head;
}
void print_list(node *head){
node *temp;
printf("Data stored is : ");
for (temp = head; temp != NULL; temp = temp->next){
printf("%d-->", temp->num);
}
printf("\n");
}
这是我的代码。我
看看评论中指出的这两行:
node *error = NULL;
error->num = 1;
因为
*error
是 NULL
,您正在地址 0x0 处写入,这会导致分段错误。换句话说:您只使用指针而不分配任何内存。
一种可能性是不使用指针,而仅使用
node
的一个实例。在这种情况下,内存是在堆栈上分配的:
node error;
error.num = 1;
error.next = NULL;
createll(head, &error);
由于
createll()
需要一个指向 error
参数的指针,因此您必须使用 &
传递变量的地址。
或者,您可以使用
malloc()
在堆上分配内存:
node *error = malloc(sizeof node);
if (!error) {
fprintf(stderr, "virtual memory exhausted!\n");
exit(1);
}
error->num = 1;
error->next = NULL;
createll(head, error);
第二种方法可能更好,因为如果在某一时刻您想要
free()
已分配的内存,那么混合堆栈和堆分配会带来麻烦。您必须检测内存是否是用 malloc()
分配的,因为像 free(&error)
这样的东西会导致运行时错误。
您还应该过度考虑您的错误处理。一般来说,
malloc()
的故障不予处理。您只需通过错误消息退出即可。内存耗尽不被视为运行时问题,而是配置错误。