当我运行此代码时,它会显示Segmentation故障。
我在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;
}
}
请建议我为什么在运行程序时遇到分段错误(核心转储)。
答案 0 :(得分:8)
你应该编译所有警告&amp;调试信息(例如gcc -Wall -g
如果使用GCC ....)。然后改进你的代码,不再发出警告。
然后你应该使用调试器,例如gdb
。
我不会更正您的代码,但您需要了解所有参数(包括指针)都是按值传递的。因此,如果将指针传递给修改其参数的某个函数,则原始指针保持不变。
您应该花几天时间阅读有关C和编程(以及调试和测试)的好书。您还应该阅读一些现有的源代码,例如来自一些自由软件项目。
BTW,在C(或C ++,BTW)编码时,使用调试器的能力是必需的技能。请阅读documentation ofgdb
及相关教程。
答案 1 :(得分: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;
}
最后一行start = p
没有做你认为它做的事情,它没有使main
内的原始指针指向新节点,因为在函数内部, start
是传递给此函数的原始指针的副本。