2011-09-20 14 views
1

Cでこれを実行できますか? Valgrindはreallocが無効なフリーを生成すると不平を言いますか?再帰呼び出しでreallocを使用する

int main(){ 
    void* mem; 
    // Do stuff 
    recurfunc(123, mem); 
    // Do stuff 
    if(mem) 
     free(mem); 
    return 0; 
} 

void recurfunc(int x, void* mem){ 
    ..... 
    // Do stuff 
    mem = realloc(mem, newsize); 
    // Do stuff 
    recurfunc(x, mem); 
    ..... 
} 
+0

(mem)が必要でない場合:空きであればNULLポインタはノーオペレーションです。 –

答えて

9

memとしてあなたが渡しているvoid *がポインタのコピーあるのではい、それは確かに、文句を言うん。関数内のポインタの変更はではなくではなく、mainに反映されます。

memを元に戻したい場合は、ポインタへのポインタを渡す必要があります。

次のコードは、このことを示しています。出力

#include <stdio.h> 
#include <stdlib.h> 

static void fn (void *p1, void **p2) { 
    p1 = realloc(p1, 200); 
    *p2 = realloc (*p2, 200); 
    printf (" In call: %p %p\n", p1, *p2); 
} 

int main (void) { 
    void *x1 = malloc (100); 
    void *x2 = malloc (100); 
    printf ("Before call: %p %p\n", x1, x2); 
    fn (x1, &x2); 
    printf (" After call: %p %p\n", x1, x2); 
    return 0; 
} 

Before call: 0x896f008 0x896f070 
    In call: 0x896f0d8 0x896f1a8 
After call: 0x896f008 0x896f1a8 
        ^
        +--- Note this bit. 

、あなたはそれが関数内で変更されているにもかかわらず、最初の値がmainを保持していることがわかります。

+0

'realloc'の結果をチェックすることを忘れないでください(' NULL'を返すことができます)。また 'mem'を' main'で 'NULL'に初期化する必要があります(そうしないと、プログラムは' realloc'へのユニット化されたポインタを渡しているのでほとんど直ちにクラッシュします)。 – CAFxX

+0

最初のreallocが無効なメモリから再割り当てされます。 – Dani

+0

Bods、私はあなたが初期の編集で修正したものについて話しているかもしれないと思った(それは編集履歴にないので)。現時点では、無効なポインタを使用してreallocを実行するステージもありません。 – paxdiablo

4

また、いくつかの他の変数はxの現在の値を保持していない限り

x = realloc(x, size); 

を使用するすべてのコードが、潜在的に漏れています。

なぜなら、再割り当てが失敗した場合、戻り値はNULLであるため、現在の「サイズ変更されていない」メモリブロックは失われます。あなたのコードで

また、関数で行う任意の計算が再帰たら、その初期化されていないポインタを解放main

  • で見られる変数を変更しないであろう機能
  • に初期化されていないポインタを渡す

    1. です関数が返す

    あなたのコードで何が起こっても "未定義の動作"です。

  • 関連する問題