c - 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;
}
解决方案
char *name; strlen(name);
是未定义的行为,段错误是合理的期望。同样对于char *name; scanf("%s", name);
在这两种情况下,name
都是未初始化的(因此您可以将其视为无处寻址。)当您尝试在无处计算字符串的长度时,会出现错误。同样,当您尝试使用scanf
将某些数据写入无处时。也许你想要:
char name[128]; scanf("%127s", name);
或类似的。无论您做什么,都需要name
在使用之前引用一个有效的内存位置。是否将其声明为数组或将其声明为指针并为其分配地址malloc
并不重要。(使其成为数组通常更容易,因为您无需担心free
它。)
推荐阅读
- powerbi - Power BI dax 添加新列,仅保留重复项并在两行之间计算
- javascript - 与 Postman 相比,为什么 Axios 请求文件上传需要更长的时间?
- php - 找出相关的 div
- android - 如何在 Angular Android App Cordova 中固定和添加证书
- javascript - 如何使用 javascript 数组方法从对象数组中选择每个单独的 id?
- python - 将 PHP 转换为 Python - API 连接
- r - 如何删除矩阵中字符串的开头?
- flutter - 当我点击一个按钮时,我的颤动中出现错误
- python-3.x - 根据条件在熊猫数据框中添加一列
- google-cloud-firestore - 我无法在组件模板中显示 vuex 状态值