C.链表问题。如何使用链表?
我正在尝试创建一个带有动态分配的课程链接列表。我总是出错。有人能告诉我是什么问题吗 其中一个错误是: 取消对空指针“coursesList”的引用 我应该为结构的每个字段分配内存吗C.链表问题。如何使用链表?,c,C,我正在尝试创建一个带有动态分配的课程链接列表。我总是出错。有人能告诉我是什么问题吗 其中一个错误是: 取消对空指针“coursesList”的引用 我应该为结构的每个字段分配内存吗 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> struct Course { int a; char courseNumber[5];
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct Course
{
int a;
char courseNumber[5];
char courseName[30];
struct Course* next;
};
struct Course* updateCoursesList(char courseName[], char courseNumber[]);
struct Course* updateCoursesList(char courseName[], char courseNumber[])
{
struct Course* coursesList = (struct Course*)malloc(sizeof(struct Course));
strcpy(coursesList->courseName, courseName);
strcpy(coursesList->courseNumber, courseNumber);
coursesList->next = NULL;
coursesList->a = 2;
printf("%d", coursesList->a);
printf("%s", coursesList->courseName);
printf("%s", coursesList->courseNumber);
return coursesList;
}
int main()
{
char newcourse[] = "math";
char newcoursenumber[] = "54321";
struct Course* A = updateCoursesList(newcourse, newcoursenumber);
}
#包括
#包括
#包括
#包括
结构课程
{
INTA;
char-courseNumber[5];
char-courseName[30];
结构课程*下一步;
};
结构课程*updateCoursesList(char-courseName[],char-courseNumber[]);
结构课程*updateCoursesList(char-courseName[],char-courseNumber[]
{
结构课程*课程列表=(结构课程*)malloc(sizeof(结构课程));
strcpy(课程列表->课程名称,课程名称);
strcpy(coursesList->courseNumber,courseNumber);
课程列表->下一步=空;
课程列表->a=2;
printf(“%d”,课程列表->a);
printf(“%s”,课程列表->课程名称);
printf(“%s”,课程列表->课程列表);
返回课程表;
}
int main()
{
char newcourse[]=“数学”;
char newcoursenumber[]=“54321”;
struct Course*A=updateCoursesList(newcourse,newcoursenumber);
}
2
math
54321math
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct Course
{
int a;
char courseNumber[6];
char courseName[30];
struct Course* next;
};
struct Course* updateCoursesList(char courseName[], char courseNumber[]);
struct Course* updateCoursesList(char courseName[], char courseNumber[])
{
struct Course* coursesList = (struct Course*)malloc(sizeof(struct Course));
if (coursesList == NULL) {
return coursesList;
}
memset(coursesList, 0, sizeof(struct Course));
strncpy(coursesList->courseName, courseName, sizeof(coursesList->courseName)-1);
strncpy(coursesList->courseNumber,courseNumber, sizeof(coursesList->courseNumber)-1);
coursesList->next = NULL;
coursesList->a = 2;
printf("%d\n", coursesList->a);
printf("%s\n", coursesList->courseName);
printf("%s\n", coursesList->courseNumber);
return coursesList;
}
int main()
{
char newcourse[] = "math\0";
char newcoursenumber[] = "54321\0";
struct Course* A = updateCoursesList(newcourse, newcoursenumber);
// do operations here
// free before exit
if (A != NULL) {
free(A);
// good practice to set vale to null after free
A = NULL;
}
return 0;
}
#包括
#包括
#包括
#包括
结构课程
{
INTA;
char-courseNumber[6];
char-courseName[30];
结构课程*下一步;
};
结构课程*updateCoursesList(char-courseName[],char-courseNumber[]);
结构课程*updateCoursesList(char-courseName[],char-courseNumber[]
{
结构课程*课程列表=(结构课程*)malloc(sizeof(结构课程));
if(coursesList==NULL){
返回课程表;
}
memset(coursesList,0,sizeof(struct-Course));
strncpy(coursesList->courseName,courseName,sizeof(coursesList->courseName)-1);
strncpy(coursesList->courseNumber,courseNumber,sizeof(coursesList->courseNumber)-1);
课程列表->下一步=空;
课程列表->a=2;
printf(“%d\n”,课程列表->a);
printf(“%s\n”,课程列表->课程名称);
printf(“%s\n”,coursesList->courseNumber);
返回课程表;
}
int main()
{
char newcourse[]=“数学\0”;
char newcoursenumber[]=“54321\0”;
struct Course*A=updateCoursesList(newcourse,newcoursenumber);
//在这里做手术
//出口前免费
如果(A!=NULL){
免费(A);
//释放后将vale设置为null的良好实践
A=零;
}
返回0;
}
您违反了
courseNumber
的大小限制。编故事“54321”
需要六个插槽,而不是五个(终止的nulchar占用额外的插槽)。因此,您的程序调用了未定义的行为,随之出现了鬼魂和食尸鬼。@WhozCraig,确实是未定义的行为,因为内存布局可能会建议打印课程号将打印54321数学
。我不明白coursesList
如何变成空值。谢谢,这很有帮助。我更改了课程号的大小数字到6。但我有一个不同的错误。在这一行:strcpy(coursesList->courseName,courseName);错误是:取消引用空指针'coursesList'。“您必须检查malloc
是否成功,即coursesList
不是空的。修复我提到的问题,.strncpy()
不足以确保printf(“%s\n”,课程列表->课程名称)对于strncpy,code>works.size保持为“sizeof(coursesList->courseNumber)-1”,数组设置为“0”,这将写入比数组大小小一个字符,请确保存在终止字符。True。(最右边的-1)在我的屏幕中不可见,但它确实保持了您所说的空字符终止。另请参见,发布“更正”代码时,请记住释放所有分配的内存。此外,还需要强制转换malloc的返回值。而且,将返回值与NULL
宏进行比较比将0
进行比较更为正确。