ошибка fwrite с ошибкой сегментации

0

вот мой код... У меня есть функция...

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;

это дает мне разные результаты.

на оконной системе, работает отлично. на ubuntu 12.04, он не дает никакой ошибки, но он не пишет никаких данных. на ubuntu 13.10, это дает мне ошибку seg в строке fwrite.

Я использовал 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)

Я не могу точно понять, что происходит...

  • 0
    Что такое PAGE_SIZE? Если он больше, чем FileHandle, то вот почему.
  • 0
    это 4096, этого должно быть достаточно.
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

Не используйте константу PAGE_SIZE с fwrite, вместо этого используйте sizeof(*fHandle). Отдельно напишите или PAGE_SIZE добавить любое дополнение, необходимое, если вам нужно сопоставить PAGE_SIZE на выходе.

(Я не совсем уверен, сколько смысла писать struct FileHandle таким образом, хотя, поскольку вы будете писать, например, адрес памяти в char *fileName а не строку имени файла. напишите поля отдельно в этом случае.)

  • 0
    Я попробую это. Я держал свой размер блока фиксированным. Это было достаточно большим. Я попробую использовать sizeof (* fHandle) вместо этого.
  • 0
    изменение размера решило мою проблему. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню