fwrite因分段错误而失败

时间:2014-02-24 02:03:44

标签: c++ c

这是我的代码......我有一个功能......

void openPageFile(filehandle *fHandle) {


   FILE *fptr;
     opening file 
     initialise fields in fHandle
     fseek(fptr, 0L, SEEK_SET);
     fwrite(fHandle, PAGE_SIZE, 1, fptr);

   }

我从另一个函数中调用它......就这样

  void test(){

     filehandle fHandle;
   openPageFile(&fHandle);

    }

和fhandle struct是......

  typedef struct FileHandle {


     char *fileName;
     //some other fields

   } fileHandle;

这给了我不同的结果。

  在Windows系统上,它的工作正常。   在ubuntu 12.04上,它没有给出任何错误,但它没有写任何数据。   在ubuntu 13.10上,它给出了fwrite行中的seg错误。

我使用valgrind来检查内存泄漏,这是我的堆栈跟踪。

Process terminating with default action of signal 11 (SIGSEGV)
==3118==  Access not within mapped region at address 0x4051EB
==3118==    at 0x4EB44A0: __GI_mempcpy (memcpy.S:166)
==3118==    by 0x4EA4EFD: _IO_default_xsputn (genops.c:463)
==3118==    by 0x4EA3611: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1356)
==3118==    by 0x4E9973C: fwrite (iofwrite.c:43)

我无法弄清楚到底发生了什么......

1 个答案:

答案 0 :(得分:1)

不要将常量PAGE_SIZEfwrite一起使用,而是使用sizeof(*fHandle)。如果需要在输出中匹配PAGE_SIZE,请分别编写或寻求添加任何必要的填充。

(我并不完全确定以这种方式编写struct FileHandle有多大意义,因为你要编写,例如char *fileName的内存地址而不是文件名字符串。在这种情况下,您需要单独编写字段。)