在 cygwin 上显示“分段错误”
Show " Segmentation fault " on cygwin
我用的是cygwin,安装了gcc-g++编译用notepad++写的c。
我想创建一个链表来存储数据,但是它总是报告"Segmentation fault (core dumped)"
我发现如果我在主函数第 4 行的 "scanf" 之后放置 "printf("OK")" 它不起作用,但会再次显示分段错误。
这是内存管理问题吗?或指针滥用?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct Node{
int data;
struct Node *link;
}node;
typedef struct Node *nodePointer;
nodePointer GetNewNode(){ // create a new node
nodePointer NewNode;
NewNode = (nodePointer) malloc(sizeof(node));
if (NewNode == NULL)
printf("memery is not enough");
return NewNode;
}
nodePointer insert(nodePointer ptr,nodePointer L,int NewData){
nodePointer NewNode,trace;
NewNode = GetNewNode();
if(ptr==NULL){ //to insert first Node
ptr->link = NewNode;
NewNode->link = NULL;
NewNode->data = NewData;
L = ptr;
}
else{ //after insert first Node,insert next Node
trace = L;
while(trace->link!=NULL) trace = trace->link;
trace->link = NewNode;
NewNode->data = NewData;
}
return L;
}
int main(){
int data;
nodePointer ptr=NULL,L=NULL,visit=NULL;
printf("input data to storage, input 0 to print data\n");
scanf("%d",&data);
while(data!=0){ // input data to store, input 0 to print data
L = insert(ptr,L,data);
scanf("%d",&data);
}
visit = L;
while(visit->link!=NULL)
printf("%d",visit->data);
}
在你的代码中你有这个:
if (ptr==NULL){
// ptr is NULL here and right after you dereference ptr
// so it's normal that you get a segfault
ptr->link = NewNode;
这里可能还有更多问题。
改正后效果很好
#include <stdio.h>
#include <malloc.h>
typedef struct Node *nodePointer;
struct Node{
int data;
nodePointer link;
}node;
nodePointer GetNewNode(){
nodePointer NewNode;
NewNode = (nodePointer) malloc(sizeof(node));
if (NewNode == NULL)
printf("memery is not enough");
return NewNode;
}
nodePointer insert(nodePointer L,int NewData){
nodePointer NewNode,trace;
if(L==NULL){
L = (nodePointer) malloc(sizeof(node));
L->data = NewData;
L->link = NULL;
}
else{
malloc(sizeof(node)); there no necessaryry
trace = L;
while(trace->link!=NULL) trace = trace->link;
NewNode = GetNewNode();
trace->link = NewNode;
NewNode->data = NewData;
NewNode->link = NULL;
}
return L;
}
int main(){
int data;
nodePointer L=NULL,visit=NULL;
printf("input data to storage, input -1 to print data\n");
while(data!=-1){
scanf("%d",&data);
if(data==1) break;
L = insert(L,data);
}
visit = L;
while(visit!=NULL){
printf("%d",visit->data);
visit = visit->link;
}
}
我用的是cygwin,安装了gcc-g++编译用notepad++写的c。
我想创建一个链表来存储数据,但是它总是报告"Segmentation fault (core dumped)"
我发现如果我在主函数第 4 行的 "scanf" 之后放置 "printf("OK")" 它不起作用,但会再次显示分段错误。
这是内存管理问题吗?或指针滥用?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct Node{
int data;
struct Node *link;
}node;
typedef struct Node *nodePointer;
nodePointer GetNewNode(){ // create a new node
nodePointer NewNode;
NewNode = (nodePointer) malloc(sizeof(node));
if (NewNode == NULL)
printf("memery is not enough");
return NewNode;
}
nodePointer insert(nodePointer ptr,nodePointer L,int NewData){
nodePointer NewNode,trace;
NewNode = GetNewNode();
if(ptr==NULL){ //to insert first Node
ptr->link = NewNode;
NewNode->link = NULL;
NewNode->data = NewData;
L = ptr;
}
else{ //after insert first Node,insert next Node
trace = L;
while(trace->link!=NULL) trace = trace->link;
trace->link = NewNode;
NewNode->data = NewData;
}
return L;
}
int main(){
int data;
nodePointer ptr=NULL,L=NULL,visit=NULL;
printf("input data to storage, input 0 to print data\n");
scanf("%d",&data);
while(data!=0){ // input data to store, input 0 to print data
L = insert(ptr,L,data);
scanf("%d",&data);
}
visit = L;
while(visit->link!=NULL)
printf("%d",visit->data);
}
在你的代码中你有这个:
if (ptr==NULL){
// ptr is NULL here and right after you dereference ptr
// so it's normal that you get a segfault
ptr->link = NewNode;
这里可能还有更多问题。
改正后效果很好
#include <stdio.h>
#include <malloc.h>
typedef struct Node *nodePointer;
struct Node{
int data;
nodePointer link;
}node;
nodePointer GetNewNode(){
nodePointer NewNode;
NewNode = (nodePointer) malloc(sizeof(node));
if (NewNode == NULL)
printf("memery is not enough");
return NewNode;
}
nodePointer insert(nodePointer L,int NewData){
nodePointer NewNode,trace;
if(L==NULL){
L = (nodePointer) malloc(sizeof(node));
L->data = NewData;
L->link = NULL;
}
else{
malloc(sizeof(node)); there no necessaryry
trace = L;
while(trace->link!=NULL) trace = trace->link;
NewNode = GetNewNode();
trace->link = NewNode;
NewNode->data = NewData;
NewNode->link = NULL;
}
return L;
}
int main(){
int data;
nodePointer L=NULL,visit=NULL;
printf("input data to storage, input -1 to print data\n");
while(data!=-1){
scanf("%d",&data);
if(data==1) break;
L = insert(L,data);
}
visit = L;
while(visit!=NULL){
printf("%d",visit->data);
visit = visit->link;
}
}