简单链接列表C代码分段错误

时间:2012-12-01 12:47:29

标签: c linked-list segmentation-fault

我正在为我的基本C作业制作链接列表程序。 但是,我总是会在.exe上获得强制关闭错误并在Ubuntu上获得分段错误。

我试图将其分解并重写,但我不知道代码在哪里失败。

我很感激你的帮助。

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


    struct node{
            char name[20];
            int mark;
            struct node *next;

    };

    struct node *addnode(char name[], float mark);


    int main(void){

            int j = 0;
            char StdName[10];
            float StdMarks;

            struct node *head = NULL;
            struct node *curr = NULL;

            head = curr = addnode('\0',0.0);

            for(j=0; j<3; j++){

                    printf("\nEnter StdName >>");

                    printf("\nMarks for %s >>", StdName);


                    curr -> next = addnode("", 5.5);
                    curr = curr->next;
            }

            curr = head -> next;

            j = 0;

            printf("\nnode\tName\tMarks");

            while(curr){

                    printf("\n%d\t%s\t%5.2f", j++, curr->name, curr->mark);
                    curr=curr->next;
            }

    return 0;

    }

    struct node *addnode(char name[], float mark){

            struct node *temp;

            temp=(struct node*)malloc(sizeof(struct node));
            strcpy(temp->name,name);
            temp->mark=mark;
            temp->next=NULL;

    return (temp);
    }

3 个答案:

答案 0 :(得分:1)

您添加的第一个节点使用单个字符'\0'作为名称,应该传递字符串:

head = curr = addnode("", 0.0);

而且这并没有指向第一个节点,它指向第二个节点:

curr = head -> next;

应该是:

curr = head;

我不知道你打算用StdName做什么,但正如hmjd所说,它应该被初始化为某个值。

char StdName[] ="stdname";

答案 1 :(得分:1)

一些错误:

  • '\0'不是char[],而是char,其值为0并转换为char*NULL指针)。使用""表示空字符串。编译器应该为此发出警告。在最高级别编译警告级别并将警告视为错误(因此您不能忽略它们)。对于gcc,标记为-Wall -Werror
  • StdName未初始化且永远不会填充,但会在printf("%s")来电中使用。

答案 2 :(得分:0)

head = curr = addnode('\0',0.0);行无效。您的addnode函数需要一个指向字符数组的指针作为第一个参数。 '\0'是一个等于0的整数值。您将name传递给strcpy,{{1}}将其用作指向源数据的指针。由于指针为0(== NULL),因此会崩溃。