2014-02-24 3 views
0

여기에 내가 이런 식으로 ... 다른 함수에서이 전화 드렸습니다에 fwrite는

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 구조체는 ...

typedef struct FileHandle { 


    char *fileName; 
    //some other fields 

    } fileHandle; 

이렇게하면 결과가 달라집니다.

Windows 시스템에서는 작동합니다. 우분투 12.04에 을 입력하면 오류가 발생하지 않지만 데이터를 쓰지는 않습니다. 우분투 13.10에서 을 실행하면 fwrite 행에 seg fault가 발생합니다.

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: [email protected]@GLIBC_2.2.5 (fileops.c:1356) 
==3118== by 0x4E9973C: fwrite (iofwrite.c:43) 

...

+0

PAGE_SIZE 란 무엇입니까? FileHandle보다 크면 그 이유가 있습니다. – immibis

+0

4096이면 충분합니다. – user3231170

+0

자, 문제가 있습니다. fHandle에서 시작하여 4096 바이트를 쓰려고 시도하지만 4096 바이트를 쓰지 못할 수도 있습니다. – immibis

답변

1

대신, fwrite와 상수 PAGE_SIZE 사용 sizeof(*fHandle)를 사용하지 마십시오. 출력에 PAGE_SIZE과 일치해야하는 경우 별도로 작성하거나 패딩을 추가하려고합니다.

(나는이 방법을 사용하여 struct FileHandle을 쓰는 것이 얼마나 의미가 있는지 모르겠다. 파일 이름 문자열이 아닌 char *fileName에 메모리 주소를 써야하기 때문에. 이 경우 필드를 별도로 작성하십시오.)

+0

나는 그것을 시도 할 것이다. 내 블록 크기를 고정시키고 있었어. 그것은 충분히 컸다. 대신 sizeof (* fHandle)를 사용해 보겠습니다. – user3231170

+0

크기를 변경하면 내 문제가 해결되었습니다. 고맙습니다 – user3231170