2017-03-25 10 views
0
'    int main() 
       { 
        int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers 
        ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers 
        free(ptr); 
        return 0; 
      }' 

最初にptrホールドメモリにはゼロが含まれていますが、新しく作成されたメモリにはゼロまたはガベージ値が含まれています。 私はcallocポインタを再割り当てするとどうなるでしょうか?

ゼロはreallocをすることができますどのように提示した場合

は、malloc関数やのcallocを使用して作成されたPTRを乗り切る知っています。

ptr = realloc(ptr,20*sizeof(int)); 

(およびいくつかは、それは同様に安全ではないと言うことがありますが、適切に(結果をキャストし、戻ってそれを割り当てたりすることなく、それが正常に動作しない)のようなreallocと呼ばれていても

+0

コードが正しくありません。 'realloc'のマニュアルページ(あなたの質問にも答えます)を読んでください。あなたは少なくともあなた自身の努力を示すことが期待されます。 – Olaf

+0

ああこれは正しい。私の答えを更新する時間:) –

+0

私はそれを続行することが難しいと言う必要があります。しかし、OPは実際にタイプミスを改善するので、私は喜んでそれをやります。 –

答えて

3

reallocNULLを返すことができ、したがって、ptrへの参照を失う)

これはありません。それはちょうどあなたが手動でインスタンスのmemsetを使用して0にメモリーの残りを設定する必要が

0に休息を設定せずに再割り当てします。

私はどうなる:

int *ptr_new = realloc(ptr,20*sizeof(int)); 
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ } 
else 
{ 
    // set the end of memory to 0 
    memset(ptr_new+10,0,sizeof(int)*10); 
    ... 

注:よくある間違い動作しているようですので、reallocの結果を裏割り当てないされ、OSが別のメモリを移動する必要がある点までをその場合、ptrポインタが無効になり、未定義の動作が発生します。

+0

以前にポインタにあったデータに 'realloc'してもらわないでしょうか?その場合、0はあなたが以前に持っていたものと同じくらいの量で維持されます。 –

+1

しかし、私たちのptrにいくつかのデータが入っていて、それをreallocすれば、reallocは新しい場所にデータをコピーします。 –

+1

はい、以前は割り当てられたメモリサイズを超えては存続しません。 –

関連する問題