首页 > 解决方案 > C - 用字符串创建链表

问题描述

我有一个存储学生信息的链表。该列表包括 onechar *和 two int,当我尝试使用字符串初始化 my 时出现问题char *,因为这样做时会出现 Seg Fault。

我尝试过的事情:使用strcpy而不是=动态分配内存。

typedef struct Student{
    int age,id;
    char *name;
    struct Student *next;
}Student;

struct Student *head = NULL;

创建链表函数

Student *create (){
    char name[128];

    Student *newStudent = (Student*)malloc(sizeof(Student));
    newStudent->name = malloc(sizeof(Student) + 1);
    newStudent->age = (rand() % (35 - 18 + 1)) + 18; // age range of student from 18-35 
    newStudent->id = rand() % 1000000 + 100000; // 6 digit id 

    scanf("%127s", name);
    strcpy(newStudent->name, name);

    newStudent->next = NULL;
    return newStudent;
}

插入函数

Student *insert(Student *newStudent){
    Student *ptr = head;

    if (head == NULL)
        return newStudent;

    while (ptr->next != NULL){
        ptr = ptr->next;
    }
    ptr->next = newStudent;
    return head;
}

构建函数

Student *build(){
    int size;
    Student *newStudent = (Student*)malloc(sizeof(Student));

    printf("Enter size of linked list: ");
    scanf("%d",&size);

    for (int i=0; i<size; i++){
        newStudent = create();
        head = insert(newStudent);
    }
    return head;
}

打印和主要功能

void print(Student *head){
    for (Student *ptr = head; ptr != NULL; ptr = ptr->next)
        printf("Student info\nName: %s, ID: %d, age: %d\n", ptr->name, ptr->id, ptr->age);

    printf("\n");
}
int main(){
    srand(time(0));

    head = build();
    print(head);
    return 0;
}

标签: cdata-structureslinked-list

解决方案


char *name; strlen(name);是未定义的行为,段错误是合理的期望。同样对于char *name; scanf("%s", name);

在这两种情况下,name都是未初始化的(因此您可以将其视为无处寻址。)当您尝试在无处计算字符串的长度时,会出现错误。同样,当您尝试使用scanf将某些数据写入无处时。也许你想要:

char name[128]; scanf("%127s", name);

或类似的。无论您做什么,都需要name在使用之前引用一个有效的内存位置。是否将其声明为数组或将其声明为指针并为其分配地址malloc并不重要。(使其成为数组通常更容易,因为您无需担心free它。)


推荐阅读