2016-05-15 19 views
2

は私がセグメンテーションフォールトを取得:関数freadセグメンテーションフォールト

以下
static FILE *randomFile = (FILE*)0; 
static void myFunction() { 
    unsigned char rand; 
    unsigned int i; 
    [...] 
    for (i = 0; i < 1000; i++) { 
    //LINE 88 BELOW 
    fread(&rand, sizeof(unsigned char), 1, randomFile); 
    printf("all well?: %hu\n", (unsigned short) rand); 
    [...] 
    } 
    [...] 
} 
int main() { 
    int i; 
    randomFile = fopen("/dev/urandom", "rb"); 
    if (randomFile == 0) { 
    return EXIT_FAILURE; 
    } 
    [...] 
    for (i = 0; i < 1000; i++) { 
    myFunction(); 
    [...] 
    } 
    [...] 
    fclose(randomFile); 
    return EXIT_SUCCESS; 
} 

gdbrunbacktraceコマンド

$ gdb a.out 
[...] 
(gdb) run 
[...] 
all well?: 5 
all well?: 234 
all well?: 9 
all well?: 79 
all well?: 26 
all well?: 108 
all well?: 21 
all well?: 195 
all well?: 192 
all well?: 148 
all well?: 64 
all well?: 211 
all well?: 245 
all well?: 90 
all well?: 173 
all well?: 238 
all well?: 167 
all well?: 125 
all well?: 14 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7a9ec82 in free() from /lib64/libc.so.6 
(gdb) bt 
#0 0x00007ffff7a9ec82 in free() from /lib64/libc.so.6 
#1 0x00007ffff7a96856 in __underflow() from /lib64/libc.so.6 
#2 0x00007ffff7a945a8 in __GI__IO_file_xsgetn() from /lib64/libc.so.6 
#3 0x00007ffff7a898e6 in fread() from /lib64/libc.so.6 
#4 0x0000000000400b69 in myFunction() 
    at FileName.c:88 
#5 0x0000000000400ebc in main (argc=1, argv=0x7fffffffdfd8) 
    at FileName.c:173 

Iドンの出力であります私は間違ったポインタを使用する方法を参照してください...それは、固定サイズの有効な場所になることを保証されているスタック上のローカル変数です...特にそれは最終的に失敗する前に数回動作します。私は何が欠けていますか?

+1

[最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)を投稿してもよろしいですか? – MikeCAT

+0

@MikeCAT検証可能なサンプルが進行中ですが、問題が見つかりました... – user5672707

答えて

0

明らかに答えはfreadまたはローカル変数とは関係ありません。 私の実際のコードは、より以下のようになります。

static void myFunction() { 
    unsigned char rand; 
    unsigned int i; 
    unsigned short int *buffer1 = malloc(sizeof(unsigned short int)*smallNumberBug); 
    unsigned short int *buffer2 = malloc(sizeof(unsigned short int)*smallNumberBug); 
    [...] 
    for (i = 0; i < 1000; i++) { 
    //LINE 88 BELOW 
    fread(&rand, sizeof(unsigned char), 1, randomFile); 
    printf("all well?: %hu\n", (unsigned short) rand); 
    [... modify buffer2 ...] 
    memcpy(buffer1, buffer2, sizeof(unsigned short int)*biggerNumber)); 
    } 
    [...] 
} 

は何とか不適切なメモリ位置への書き込みがされてローカルスタックになった...これがいかに特定の...ない割り当て解除が、smallNumberBugを変更すると解決biggerNumberに等しくなるように私の問題。

関連する問題