2017-08-15 13 views
-1

私はコード内のスピードを上げたいのでreallocを使用しようとしています。特定の条件が満たされたとき、より大きなサイズの倍精度浮動小数点型ポインタを再割り当てしたいが、私はセグメンテーション違反を得る。ここにコードがあります。C - ポインターへのポインタにreallocを使用すると、セグメンテーションフォールトが発生する

if (p_bheap->currentSize == p_bheap->arraySize){ 
    p_bheap->arraySize = p_bheap->arraySize*2 + 1; 
    p_bheap->pp_array = realloc(p_bheap->pp_array, p_bheap->arraySize); 
} 

この結果、セグメント化エラーが発生します。しかし、私自身の再割り当て機能を作っても機能します。

if (p_bheap->currentSize == p_bheap->arraySize){ 
    p_bheap->pp_array = bheap_reallocate(p_bheap); 
} 

void** bheap_reallocate(bheap* p_bheap){ 
    p_bheap->arraySize = p_bheap->arraySize*2 + 1; 
    void** pp_newArray = malloc(p_bheap->arraySize*sizeof(void*)); 
    for (int i = 0; i < p_bheap->currentSize; i++){ 
     pp_newArray[i] = p_bheap->pp_array[i]; 
    } 
    free(p_bheap->pp_array); 
    return pp_newArray; 
} 

私が見落としたことのある明確な誤りはありますか?そして私はバイナリヒープをプログラミングしていると思っています。

+5

[ 'realloc'](http://en.cppreference.com/w/c/memory/realloc)に渡されたサイズがジャストサイズに渡された[' malloc'](HTTPのようなものです://en.cppreference.com/w/c/memory/malloc):***バイトのサイズ***(要素ではない)。 –

+4

ところで、引数として渡したポインタに[realloc'](http://en.cppreference.com/w/c/memory/realloc)の結果を戻してはいけません。 ['realloc'](http://en.cppreference.com/w/c/memory/realloc)が失敗すると' NULL'を返し、元のポインタを失い、メモリリークを起こします。 –

+0

私はあなたの解決策を捉えていませんでした。私は何を変えなければならないのですか? –

答えて

-1

結果を受け取るために同じメモリスペースを使用することはできません。一時配列を使用するか、別のスペースを割り当ててみてください。

+0

配列がありません。ちょうどポインタ。 –

+2

これは* a *の問題ですが、OPには問題はありません。 –

0

オブジェクトが既に割り当てられている場合は、strとし、そのメモリを別のサイズに調整する場合は、テンポラリ変数を使用して、メモリ損失を防ぐためにreallocが失敗します。イラスト:

char *str = calloc(20, 1); 
if(str) // should always check return of calls to [c][m][re]alloc. 
{ // at this point, str owns 20 bytes of memory. If you use str in a subsequent 
    // call to realloc, and the call fails, then the memory previously allocated in 
    // the original call to calloc() will be lost. (memory leak). 
.... 
char *tmp = {0};//So instead, use a temporary variable to accept memory 
       //and provide a way to recover if allocation fails 

tmp = realloc(str, 40);//newsize (40) in bytes 
if(!tmp) //test reallocation 
{ 
    //reallocation failed. 
    //free previously allocated memory, and decide how to proceed. 
    //In this case, return a NULL, and let the calling function decide. 
    free(str);//if allocation fails, free the previous object and leave 
    return NULL; 
} 
//reallocation succeeded. Proceed normally 
str = tmp;//reallocation succeeded, assign its address to str and proceed normally 
関連する問題