0

クライアントという名前の構造体があり、この構造体の配列を作成しました。

typedef struct auxiliarRegistre{
 char name[50];
 char CPF[20];
 char addr[100];
}clients;

clients PrimaryClients[100];

この配列にデータを挿入する関数を呼び出していますが、制限に達するまで可能な値の量を増やしたいです。これは正しい方法ですか?

int *pointer = (clients *) malloc(sizeof(clients));
4

1 に答える 1

2

一例を次に示します。

#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 が返されると、既に割り当てたメモリへの参照が失われ、メモリ リークが発生します。また、呼び出しが成功したことがわかるまで、配列のサイズを更新したくありません。

于 2013-10-28T14:28:33.790 に答える