首页 > 解决方案 > 从二进制分段错误中读取时

问题描述

我有 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 从该文件中读取并打印人员的姓名,但此代码出现分段错误,我错过了什么?

标签: c

解决方案


write不写指向的事物的值。它将写入指针。当您阅读时,您会阅读指针,但它们是无效的。

要么将nameand声明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 );
}

推荐阅读