为什么我会出现分段错误?

mia*_*mia 0 c segmentation-fault

当我运行此代码时,它显示分段错误.

我已经搜索了Stackoverflow上的其他相关帖子,但没有得到答案或为什么我的代码显示此错误.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct node{
    int info;
    struct node *next;
};
typedef struct node NODE;


NODE* getNode();
void insertAtFirst(NODE*,int);
void traverse(NODE*);

int main(){
    NODE *start = NULL;
    insertAtFirst(start,1);
    insertAtFirst(start,4);
    traverse(start);
    return 0;
}

void insertAtFirst(NODE *start, int n){
    NODE *p = (NODE*)malloc(sizeof(NODE));
    p->info = n;
    if(start == NULL){
        p->next = NULL;
    }
    else{
        p->next = start;
    }
    start = p;
}

void traverse(NODE *start){
    NODE *temp;
    temp = start;
    while(temp != NULL){
        printf("%d  ", temp->info);
        temp = temp->next;
    }
}
Run Code Online (Sandbox Code Playgroud)

请建议我为什么在运行程序时遇到Segmentation故障(核心转储).

Bas*_*tch 8

您应该编译所有警告和调试信息(例如,gcc -Wall -g如果使用GCC ....).然后改进您的代码以获得更多警告.

然后你应该使用调试器,例如gdb.

我不会更正您的代码,但您需要了解所有参数(包括指针)都是通过值传递的.因此,如果将指针传递给修改其参数的某个函数,则原始指针保持不变.

您应该花几天时间阅读有关C和编程(以及调试和测试)的好书.您还应该阅读一些现有的源代码,例如来自某个自由软件项目.

BTW,使用调试器的能力是用C(或C++,BTW)编码时所需的技能.所以阅读有关它的文档gdb和教程.

  • @dave我们已经有2篇关于"通用段错误"的规范帖子.[什么是分段错误?](http://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault)和[分段错误的常见原因的确定列表](http://stackoverflow.com /问题/ 33047452 /最终名单 - 的 - 共理由换分割的故障). (2认同)

gio*_*gim 5

void insertAtFirst(NODE *start, int n){
    NODE *p = malloc(sizeof(NODE));
    p->info = n;
    if(start == NULL){
        p->next = NULL;
    }
    else{
        p->next = start;
    }
    start = p;
}
Run Code Online (Sandbox Code Playgroud)

最后一行start = p没有按照你的想法做,它不会使原始指针main指向新节点,因为在函数内部,start是传递给该函数的原始指针的副本.