一例を次に示します。
#include <stdlib.h>
typedef struct auxiliarRegistre { ... } clients;
int arrSize = SOME_START_SIZE;
clients *arr = malloc( arrSize * sizeof *arr );
/**
* Do stuff with arr. When you need to extend the buffer, do the following:
*/
clients *tmp = realloc( clients, sizeof *arr * ( arrSize * 2));
if ( tmp )
{
arr = tmp;
arrSize *= 2;
}
拡張が必要になるたびにバッファーのサイズを 2 倍にするのが一般的な戦略です。これにより、 への呼び出し回数が最小限に抑えられrealloc
ます。また、深刻な内部断片化につながる可能性もあります。128 個の要素があり、あと 1 つだけ保存する必要がある場合、全体で 256 個の要素を割り当てることになります。次のように、一定額だけ延長することもできます。
clients *tmp = realloc( clients, sizeof *arr * ( arrSize + extent ));
if ( tmp )
{
arr = tmp;
arrSize += extent;
}
realloc
の結果をバッファに直接割り当てたくないことに注意してください。エラーが原因で NULL が返されると、既に割り当てたメモリへの参照が失われ、メモリ リークが発生します。また、呼び出しが成功したことがわかるまで、配列のサイズを更新したくありません。