我正在为我的基本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);
}
答案 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),因此会崩溃。