分段错误但找不到bug

时间:2012-08-18 20:38:00

标签: c pointers

#include<stdio.h>
#include<stdlib.h>

struct node {
    char str[200];
    int nn;
    struct node* next;
};

int number;
struct node* start=NULL;
struct node* current;
//function to insert into the list 

void insert() {
    struct node* n;
    n=(struct node*)malloc(sizeof(struct node));
    n->str=malloc(sizeof(char) * 1000);
    printf("please enter the data that you would like to insert: ");
    gets(n->str);
    printf("asdasdasdasd");
    n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

    }

    printf("done\n");
}

void display() {
    current=start;
    int i=0;
    while( current->next!=NULL ) {
        printf("node%d= %s\n",++i,current->str);
        current=current->next;

    }
    printf("this the end");
}


int main() {
    char c;
    int input;

    do {
        printf("Select from the following options:\n"
           "1.Display list\n"
           "2.Add to list\n"
           "3.delete from list\n");

        scanf("%d",&input);
        switch (input) {
            case 1: display(); break;
            case 2: insert(); break;
      //    case 3: delete(); break;
            default : printf("Please select 1 , 2 or 3\n");
        }
        printf( "would you like to continue?(y/n)\n");
        scanf("%s",&c);
    } while(c=='y');

    return 0;
}

这在插入功能A SEGMENTATION FAULT中给我一个错误!

我尝试过但事实并非如此。我指点有点弱,实际上很困惑!

请告诉我我做错了什么,请帮帮我。忘记我的链表逻辑,让它错了。我只是想知道为什么会发生分段错误!

6 个答案:

答案 0 :(得分:3)

由于您没有告诉我们您的段错误发生的行,我只能猜测。

至少这些线条对我来说听起来很虚伪:

if( start==NULL ) {
    start->next=n;
    current=n;
}

您确定要startNULL取消引用吗?这就是你在start->next做的事情。解除引用NULL会导致段错误。

也许这会按照你期望的方式运作:

if( start==NULL ) {
    start=n;
    current=n;
}

所以基本上,如果尚未定义start,请定义它,它也会成为您当前的项目。

答案 1 :(得分:3)

你有很多错误,但你的崩溃是因为你没有分配开始

n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

你询问start是否为null,如果是,你试着通过调用start-&gt; next来读它。你需要先分配它。

答案 2 :(得分:2)

  1. 编译错误
    n->str=malloc(sizeof(char) * 1000);

      

    这是地址重新分配一个常量!!!!!你正在改变数组的地址???

  2. 危险功能,执行概率为25%。

    gets(n->str);

  3. 在空指针处设置值!!!

    struct node* start=NULL;....
    start->next=n;

  4. 工作代码示例

      #include<stdio.h>
        #include<stdlib.h>
    
        struct node {
            char *str;
            int nn;
            struct node* next;
            };
    
        int number;
        struct node* start=NULL;
        struct node* current;
        //function to insert into the list
    
        void insert() {
            struct node* n;
            n=(struct node*)malloc(sizeof(struct node));
            n->str=(char*)malloc(sizeof(char) * 1000);
            printf("please enter the data that you would like to insert: ");
            scanf("%s",n->str);
            printf("asdasdasdasd");
            n->next=NULL;
            if( start==NULL ) {
                //start->next=n;
                current=n;
            }
            else {
    
            current->next=n;
            current=n;
    
            }
    
            printf("done\n");
        }
    
        void display() {
            current=start;
            int i=0;
            while( current->next!=NULL ) {
                printf("node%d= %s\n",++i,current->str);
                current=current->next;
    
            }
            printf("this the end");
            }
    
    
        int main() {
    
            char c;
            int input;
    
            do {
                printf("Select from the following options:\n"
                   "1.Display list\n"
                   "2.Add to list\n"
                   "3.delete from list\n"
                   );
    
    
            scanf("%d",&input);
            switch (input) {
    
                case 1: display(); break;
                case 2: insert(); break;
            //    case 3: delete(); break;
                default : printf("Please select 1 , 2 or 3\n");
    
                }
            printf( "would you like to continue?(y/n)\n");
            scanf("%s",&c);
            }while(c=='y');
    
        return 0;
        }
    

答案 3 :(得分:2)

您应该使用调试器(而不是我们)来查找有关该问题的更多信息。

例如gdb(GNU Debuger)。

答案 4 :(得分:1)

if( start==NULL ) {
        start->next=n;
        current=n;
    }

我觉得你这里有点问题; - )

答案 5 :(得分:1)

下一行不安全:

   scanf("%s",&c);

scanf添加了终结空字符'\ 0',在您的情况下会破坏堆栈。