2016-04-30 18 views
2

アップデート:私は、私は理解し考え、それ以下のフィードバックごとに、次のように私は、コードを修正しましたが、それはまだ面倒です:ここで私のmalloc/reallocに問題がありますか?

以下
unsigned int count = 0; 
    char* filebuffer; 
    filebuffer = malloc(sizeof(char)); 
    if (!filebuffer) 
    { 

     error(500); 
     return false; 
    } 

    while (fread(filebuffer, sizeof(char), 1, file) == 1) 
    { 
    count++; 
    filebuffer = realloc(filebuffer, count * sizeof(char)); 
    printf("%lu\n", (count + 1) * sizeof(char)); 
    } 
    if (feof(file)) 
    { 
    *content = filebuffer; 
    *length = count; 
    } 

はファイルを通過することを意図しているいくつかのコードですこれはpopen(PHPファイル)によって関数にパイプされ、バッファに格納され、次に同じ内容のポインタと* lengthに読み込まれたバイト数を与えます。

ただし、動作しません。 Valgrindのは言う:

==7608== Conditional jump or move depends on uninitialised value(s) 
==7608== at 0x4C31FCE: strstr (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7608== by 0x4036C0: interpret (server.c:513) 
==7608== by 0x401D66: main (server.c:259) 
==7608== Uninitialised value was created by a heap allocation 
==7608== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7608== by 0x4C2CF1F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7608== by 0x40418C: load (server.c:662) 
==7608== by 0x403672: interpret (server.c:502) 
==7608== by 0x401D66: main (server.c:259) 

コードは次のとおりです。事前に

unsigned int count = 0; 
    char* filebuffer; 
    filebuffer = malloc(sizeof(char)); 

    if (!filebuffer) 
    { 
     printf("oh noes\n"); 
     error(500); 
     return false; 
    } 

    while (fread(filebuffer, sizeof(char), 1, file) == 1) 
    { 
     count++; 
     filebuffer = realloc(NULL, sizeof(filebuffer) + sizeof(char)); 

    } 
    if (feof(file)) 
    { 
    *content = filebuffer; 
    *length = count; 
    } 

任意のフィードバックを歓迎と感謝。

+0

filebuffer = realloc(NULL、sizeof(filebuffer)+ sizeof(char)))を使用する必要があります。これは面倒です – dlmeetei

+0

'realloc'エラーに加えて、' valgrind'の古いバージョン( '〜3.10'など)を使用している場合、' filebuffer = malloc(sizeof(char)); 'は*条件ジャンプまたは移動は、初期化されていない値(*)に依存します。それを修正するには 'filebuffer = calloc(1、sizeof(char));'( 'malloc'は割り当てられたスペースを初期化せず、' calloc'と 'valgrind'の古いバージョンはこれに間違ってフラグを付けます) –

+0

どの行が行513 ? – immibis

答えて

0

あなたのreallocは以前に割り当てられたバッファを使用しません。また、バッファのサイズを追跡する必要があります。

filebuffer = realloc(NULL, sizeof(filebuffer) + sizeof(char)); 

それはする必要があります

filebuffer = realloc(filebuffer, <the new size>); 

しかしfilebuffer = malloc(sizeof(char));だけである、あなたは1バイト、各タイプを割り当てていることがあるほど悪く見えます。あらかじめファイルのサイズがわからない場合は、ブロック単位で割り当てることをお勧めします。

#define BLOCKSIZE 1024 
char* filebuffer; 
size_t current; 
filebuffer = malloc(BLOCKSIZE); 
current = BLOCKSIZE; 
// in the loop 
filebuffer = realloc(filebuffer, BLOCKSIZE + current); 
current = BLOCKSIZE + current; 
+0

もちろん、その他の重大な問題があります。 – fluter

+0

こんにちは@fluterあなたの提案に似た何かをする元の投稿に修正コードを投稿しました。それ以上のフィードバックをいただければ幸いです。ファイルのサイズは事前にわかっていません。 PHPファイル – edd91

+0

@ edd91は、whileループの前に 'count = 1;'を設定する必要があります。そうでなければ、reallocは常に0になり、 'fread(filebuffer + count、sizeof(char)、1、file) – fluter

2

reallocの引数が間違っています。

sizeof(filebuffer)は、sizeof(char*)に等しい。割り当てられた配列のサイズには評価されません。

別の変数を使用してサイズを記録し、その変数を使用する必要があります。 countはその変数と思われますが、あなたのコードから何をしているのか、それらの変数が何を表しているのかははっきりしていません。あなたは

filebuffer = realloc(NULL, some_size); 

を使用する場合

はまた、メモリリークの多くにつながる

filebuffer = malloc(some_size); 

に相当します。メモリリークを止めるには、

filebuffer = realloc(filebuffer, some_size); 
+0

こんにちは@ R-Sahuさん、ありがとうご意見ありがとうございます。コードを修正して元の投稿に新しいコードを投稿しましたが、私はまだ面倒です、それ以上のアイデアですか? – edd91

+0

どういう意味ですか? "まだ厄介な"とは何ですか?症状は何ですか? –

関連する問題