尝试构建单个链接列表时,分段核心被转储

问题描述 投票:0回答:1

我正在学习 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");
}

这是我的代码。我

c linked-list segmentation-fault function-pointers dsa
1个回答
0
投票

看看评论中指出的这两行:

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()
的故障不予处理。您只需通过错误消息退出即可。内存耗尽不被视为运行时问题,而是配置错误。

© www.soinside.com 2019 - 2024. All rights reserved.