c - 从二进制分段错误中读取时
问题描述
我有 2 个文件是 creator.c 和 reader.c
创建者.c:
#include <stdio.h>
#include <string.h>
struct Person{
char *name;
int numb;
char *kind;
};
int main() {
struct Person *per1=malloc(sizeof(struct Person));
struct Person *per2=malloc(sizeof(struct Person));
struct Person *per3=malloc(sizeof(struct Person));
struct Person *per4=malloc(sizeof(struct Person));
struct Person *per5=malloc(sizeof(struct Person));
struct Person *per6=malloc(sizeof(struct Person));
char per1_name[]="a1";
char per2_name[]="b1";
char per3_name[]="c1";
char per4_name[]="d1";
char per5_name[]="e1";
char per6_name[]="f1";
per1->name=malloc(strlen(per1_name)+1);
per2->name=malloc(strlen(per2_name)+1);
per3->name=malloc(strlen(per3_name)+1);
per4->name=malloc(strlen(per4_name)+1);
per5->name=malloc(strlen(per5_name)+1);
per6->name=malloc(strlen(per6_name)+1);
strcpy(per1->name,per1_name);
strcpy(per2->name,per2_name);
strcpy(per3->name,per3_name);
strcpy(per4->name,per4_name);
strcpy(per5->name,per5_name);
strcpy(per6->name,per6_name);
per1->numb=1;
per2->numb=2;
per3->numb=3;
per4->numb=4;
per5->numb=5;
per6->numb=6;
char per1_kind[]="x";
char per2_kind[]="y";
char per3_kind[]="z";
char per4_kind[]="q";
char per5_kind[]="w";
char per6_kind[]="e";
per1->kind=malloc(strlen(per1_kind)+1);
per2->kind=malloc(strlen(per2_kind)+1);
per3->kind=malloc(strlen(per3_kind)+1);
per4->kind=malloc(strlen(per4_kind)+1);
per5->kind=malloc(strlen(per5_kind)+1);
per6->kind=malloc(strlen(per6_kind)+1);
strcpy(per1->kind,per1_kind);
strcpy(per2->kind,per2_kind);
strcpy(per3->kind,per3_kind);
strcpy(per4->kind,per4_kind);
strcpy(per5->kind,per5_kind);
strcpy(per6->kind,per6_kind);
FILE *write_ptr;
write_ptr = fopen("save.bin","wb");
fwrite(per1,sizeof(struct Person),1,write_ptr);
fwrite(per2,sizeof(struct Person),1,write_ptr);
fwrite(per3,sizeof(struct Person),1,write_ptr);
fwrite(per4,sizeof(struct Person),1,write_ptr);
fwrite(per5,sizeof(struct Person),1,write_ptr);
fwrite(per6,sizeof(struct Person),1,write_ptr);
return 0;
}
读者.c
#include <stdio.h>
struct Person{
char *name;
int numb;
char *kind;
};
int main(){
FILE *fp=fopen("./save.bin","rb");
struct Person *person1=malloc(sizeof(struct Person));
fread(person1,sizeof(struct Person),1,fp);
printf("%s\n",person1->name );
}
creator.c 文件创建一个名为 save.bin 的二进制文件并将人员结构数据推送为二进制文件,reader.c 从该文件中读取并打印人员的姓名,但此代码出现分段错误,我错过了什么?
解决方案
write
不写指向的事物的值。它将写入指针。当您阅读时,您会阅读指针,但它们是无效的。
要么将name
and声明kind
为固定大小的数组,要么分别写入它们的值,然后在读取它们之前不要忘记 malloc 新内存。
编辑:最好先写下名称的长度,然后再准确读取该长度,因为可以跟随更多记录。
int main() {
struct Person *per1=malloc(sizeof(struct Person));
per1->name=malloc(strlen("hello")+1);
strcpy(per1->name,"hello");
FILE *write_ptr;
write_ptr = fopen("save.bin","wb");
fwrite(per1,sizeof(struct Person),1,write_ptr);
int len= strlen(per1->name);
fwrite(&len,sizeof(int), 1, write_ptr; // first write the length
fwrite(per1->name,len,1,write_ptr); // then write those bytes
fclose(write_ptr); // don't forget!
return(0);
}
// reader
int main(){
FILE *fp=fopen("./save.bin","rb");
struct Person *person1=malloc(sizeof(struct Person));
fread(person1,sizeof(struct Person),1,fp);
int len;
fread(&len,sizeof(int),1,fp); // now read the length
person1->name=malloc(len+1); // allocate memory for it,
fread(person1->name,len,1,fp); // read it
person1->name[len]= '\0'; // and terminate it
printf("%s\n",person1->name );
}
推荐阅读
- javascript - 如何处理未在 Safari 上安装的自定义协议仍触发 onblur 事件?
- xcode11.2.1 - 在 Xcode 11.2.1 中启动应用程序时应用程序崩溃
- python - 遍历一个列表并返回 n 个连续值的最大和
- c# - 如何使用 asp.net core 2.2 从 bson 数组中形成逗号分隔的字符串?
- c# - .netcore ant .Net3.5 的 Json 序列化器
- microsoft-graph-api - 过滤日历事件的位置属性
- vue.js - 每次客户端请求新页面时,Nuxt“通用”模式是否会从节点服务器重新请求页面?
- objective-c - Swift 编译器标志不会影响 Objective-C 代码
- c# - 如何更改 SignalR 最大消息大小?
- javascript - 比较使用“D MMM YY - HH.MM.SS”格式的 javascript 中的日期