我正在为我的基本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);
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("nnodetNametMarks");
while(curr){
printf("n%dt%st%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);
}
一些错误:
-
' '
不是一个char[]
,而是一个char
,其值0
并转换为char*
(NULL
指针)。对空字符串使用""
。编译器应该为此发出警告。使用最高警告级别进行编译,并将警告视为错误(因此不能忽略它们)。对于gcc
,标志是-Wall -Werror
的。 -
StdName
不会初始化,也不会填充,而是在printf("%s")
调用中使用。
添加的第一个节点使用单个字符' '
作为名称,此时应传递字符串:
head = curr = addnode("", 0.0);
而且这并不指向第一个节点,它指向第二个节点:
curr = head -> next;
应该是:
curr = head;
我不知道你打算用StdName
做什么,但正如 hmjd 所说,它应该初始化为某个值。
char StdName[] ="stdname";
head = curr = addnode(' ',0.0);
行无效。addnode
函数需要指向字符数组的指针作为第一个参数。 ' '
是等于 0 的整数值。将name
传递给strcpy
,将其用作指向源数据的指针。由于指针为 0 (== NULL),因此会出现崩溃。