2

我正在为我的基本 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);
    }
4

3 回答 3

1

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

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

而且这也不指向第一个节点,它指向第二个:

curr = head -> next;

应该:

curr = head;

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

char StdName[] ="stdname";
于 2012-12-01T12:52:37.693 回答
1

几个错误:

  • '\0'不是 a char[],而是 a char,其值为 is0并转换为char*(NULL指针)。用于""空字符串。编译器应该为此发出警告。以最高警告级别编译并将警告视为错误(因此您不能忽略它们)。对于gcc标志是-Wall -Werror.
  • StdName未初始化且从不填充但在printf("%s")调用中使用。
于 2012-12-01T12:52:45.177 回答
0

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

于 2012-12-01T12:54:31.183 回答