fscanf()seg fault程序接收信号EXC_BAD_ACCESS

时间:2012-10-15 13:11:39

标签: c file segmentation-fault exc-bad-access scanf

 16     char* input = (char*) argv[1];
 17     FILE *fp = fopen (input, "r");
 18     if( fp == NULL)
 19     {
 20         printf(" reading input file failed");
 21         return 0;
 22     }
 23     fseek(fp,0,SEEK_END);
 24     int file_size = ftell(fp);
 29     rewind(fp);
 30     int i;
 31     int totalRun;
 32     char * temp;
 33     char* model;
 34     char* example;
 36     fscanf(fp,"%d",&totalRun);
 37     fscanf(fp,"%s",model);

以上是我的代码我在第37行遇到此错误“fscanf(fp,”%s“.model)”

程序收到信号EXC_BAD_ACCESS,无法访问内存。原因:KERN_PROTECTION_FAILURE,地址:0x00007fff5fc00730 0x00007fff8db20bcb in __svfscanf_l()

这会导致什么?我查看了gdb中的* fp。在读取totalRun _offset = 0之前和读取_offset = 4096之后.totalRun的内容是正确的(“3”)。我只读了一行,为什么偏移4096?还有什么是_blksize在文件中引用。

谢谢

2 个答案:

答案 0 :(得分:2)

你需要为model分配内存,它是一个未初始化的指针。同时确保fscanf()不会超出分配给model的数组。如果model不需要通过动态分配,那么只需使用本地数组。例如:

char model[1024];
if (1 == fscanf(fp, "%1023s", model))
{
}

始终检查fscanf()的返回值,该值返回成功分配的数量,否则如果对fscanf()的调用失败,程序将处理未初始化的变量。< / p>

答案 1 :(得分:1)

变量model未初始化。必须先为其分配内存,然后才能在fscanf()方法中使用它。你可以用两种方式做到:

  1. 静态 - char model[1024];
  2. 动态 - char * model = (char*) malloc(1024);完成后,不要忘记使用free()取消分配缓冲区。