C-为什么我会遇到细分故障



当我运行此代码时,它会显示一个分段故障。

我在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;
    }
}

请建议我为什么在运行程序时会得到细分故障(核心转储)。

您应该使用所有警告&amp;调试信息(例如gcc -Wall -g如果使用GCC ....)。然后改进您的代码以获取更多警告。

然后您应该使用调试器,例如。gdb

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

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

顺便说一句,使用调试器的能力是在C中编码(或在C ,BTW中)时所需的技能。因此,请阅读gdb的文档和有关它的教程。

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;
}

最后一行start = p不执行您认为所做的事情,它不会使main内部的原始指针指向新节点,因为在函数内部,start是传递给此功能的原始指针的副本。

相关内容

  • 没有找到相关文章

最新更新