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