c - 尝试写入文件时出现分段错误
问题描述
我正在学习链表以及如何使用它,我制作了一个简单的程序,用这种方法存储和打印学生的年龄和姓名。我想做其他事情,我想将学生的这些数据存储在一个文本文件中。但是当我尝试写入这个文件时,它会抛出一个语义错误错误。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
typedef struct student {
char * name;
int age;
struct student *next;
}student;
student * createStudent(char *, int);
student * append(student *, student *);
void printStudents(student *, int);
void storeStudents(student *, int, int flag);
int main(){
student *end, *start , *newStudent, *tmp;
int studentAge, nStudents, i = 1;
char * studentName = (char *)malloc(sizeof(char) *50);
if(!studentName){
printf("Couldn't allocate the memory\n");
exit(EXIT_FAILURE);
}
printf("Enter the number of students : ");
scanf("%d", &nStudents);
while(nStudents > 0){
printf("Enter the age from the %d student: ", i);
scanf("%d", &studentAge);
printf("Enter the name from the %d student: ", i);
scanf("%s", studentName);
if((i-1) ==0){
start = createStudent(studentName, studentAge);
end = start;
storeStudents(start, i , 0);
printStudents(start, i);
}else{
newStudent = createStudent(studentName, studentAge);
end = append(end, newStudent);
storeStudents(end, i , 1);
printStudents(end, i);
}
nStudents--;
i++;
}
tmp = start -> next;
free(start);
start = tmp;
tmp = start->next;
free(start);
free(tmp);
return 0;
}
void printStudents(student * start, int i){
if(start != NULL) printf("Student number %d\nName: %s\nAge: %d\n", i, start -> name, start -> age);
return;
}
void storeStudents(student * ptr, int i, int flag){
FILE *pfile = NULL;
switch (flag){
case 0: pfile = fopen("students.txt", "w+"); break;
case 1: pfile = fopen("students.txt", "a+"); break;
}
if(!pfile){
fprintf(stderr, "Couldn't open the file\n");
exit(EXIT_FAILURE);
}
else if(ptr != NULL){
fprintf(pfile, "Student number %d\nName: %s\nAge: %s\n", i, ptr -> name, ptr -> age);
}
fclose(pfile);
pfile = NULL;
return;
}
student * createStudent(char * name, int age){
student * ptr = NULL;
ptr = (student *) malloc(sizeof(student));
ptr->name = (char *)malloc(sizeof(char) *50);
if(!ptr || !(ptr ->name)){
printf("Couldn't allocate the memory\n");
exit(EXIT_FAILURE);
}
ptr-> age = age;
ptr ->name = name;
ptr ->next = NULL;
return ptr;
}
student * append(student * end, student * new){
end->next = new;
end = new;
return end;
}
错误发生在函数 storeStudents 中。
是什么导致了这个错误?
解决方案
好的,我使用在线 C 编译器/调试器运行了这段代码,它告诉我 segfault 位于 fprintf() 行,您在年龄输出上的类型 string / int 类型不匹配。
这与您的 createStudent 没有进行字符串复制并且没有释放所有 malloc 的内存相结合,都在您的应用程序中造成错误。
我重新运行了您的代码:
fprintf(pfile, "Student number %d\nName: %s\nAge: %d\n", i, ptr -> name, ptr -> age);
它不再出现段错误。
请同时解决其他问题。
推荐阅读
- javascript - MongoDB nodejs:如何修改另一个字段搜索的对象中的字段值
- reactjs - react-pdf:异步使用 PDFDownloadLink 而不会阻塞应用程序的其余部分
- javascript - 如何以与 Excel 兼容的方式将带有 colspan 的 HTML 表格复制到剪贴板?
- next.js - Next.js 是否可以在使用域路由时禁用子文件夹路由?
- python - Python - valuecounts() 方法 - 显示所有结果
- wordpress - 编辑 WooCommerce 模板文件,不受未来更新的影响
- vue.js - 您可以将变量传递给 Vuetify 组件的“颜色”字段吗?
- python - 如何在数据框中删除重复项并首先保留两个例外?
- python - 在 Python 中定义“api”回溯错误
- firebase - 如何使用 FCM 在 Flutter 中实现推送通知?