C.链表问题。如何使用链表?

C.链表问题。如何使用链表?,c,C,我正在尝试创建一个带有动态分配的课程链接列表。我总是出错。有人能告诉我是什么问题吗 其中一个错误是: 取消对空指针“coursesList”的引用 我应该为结构的每个字段分配内存吗 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> struct Course { int a; char courseNumber[5];

我正在尝试创建一个带有动态分配的课程链接列表。我总是出错。有人能告诉我是什么问题吗

其中一个错误是:

取消对空指针“coursesList”的引用

我应该为结构的每个字段分配内存吗

#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);
}
  • 函数的输入是一个字符数组,而不是字符串,strcpy将一直出现,直到它找到一个“\0”

  • 请将strncpy与数组大小一起使用,以避免崩溃、数据覆盖或损坏结构中的其他字段

  • courseNumber大小(如果不足以容纳5个字符字符串加“\0” 字符串运算需要“,\0”,否则应在数组中打印字符。保留值5将给出输出

     2
     math
     54321math
    
  • 有意使用“size()-1”在stncpy中添加“\0”,以防输入字符数组没有“\0”将由memset和stncpy逐个放置

     #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”,课程列表->课程名称)works.size保持为“sizeof(coursesList->courseNumber)-1”,数组设置为“0”,这将写入比数组大小小一个字符,请确保存在终止字符。True。(最右边的-1)在我的屏幕中不可见,但它确实保持了您所说的空字符终止。另请参见,发布“更正”代码时,请记住释放所有分配的内存。此外,还需要强制转换malloc的返回值。而且,将返回值与
    NULL
    宏进行比较比将
    0
    进行比较更为正确。