10

コードをより効率的にしようとしています。私はこのようなものを持っています:

    typedef struct{
    ...
    }MAP;



    MAP* pPtr=NULL;
    MAP* pTemp=NULL;
    int iCount=0;
    while (!boolean){
    pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP));
    if (pTemp==NULL){
    ...
    }
    pPtr=pTemp;
    ...
    iCount++;
    }

メモリは動的に割り当てられています。コードをより効率的にするために、realloc 呼び出しを減らしたいと思います。新しいサイズが古いサイズと等しい場合、realloc がどのように動作するかを知りたいです。呼び出しは単に無視されますか?

4

3 に答える 3

10

標準 C では指定されていません。すべての標準 C で保証されているのは、新しいオブジェクトの内容は、新しいサイズと古いサイズの小さい方まで、割り当て解除前の古いオブジェクトの内容と同じでなければならないということです。

ただし、GNU libc を使用している場合は、同じアドレスを返すように明示的に指定されています。詳細については、こちらを参照してください。

指定した新しいサイズが古いサイズと同じである場合、reallocは何も変更せず、指定したのと同じアドレスを返すことが保証されます。

于 2013-09-04T15:26:32.983 に答える
2

C 標準では、何が起こるかは指定されていないため、実装に任せることができます。渡されたポインターを返さない、まともな実装は想像できませんが、安全なオプションは、独自のコードで割り当てのサイズが変更されたかどうかを確認することです。それも確かに関数呼び出しをスキップします。

(ちなみに、からの戻り値をキャストしないでくださいrealloc。これは必須ではなく、忘れると未定義の動作が隠される可能性があります#include <stdlib.h>。)

于 2013-09-04T15:19:19.513 に答える