动态分配结构数组

时间:2013-10-28 13:29:41

标签: c malloc dynamic-allocation

我有一个名为clients的结构,我创建了这个结构数组。

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

clients PrimaryClients[100];

我正在调用一个函数将数据插入到这个数组中,但我想增加可能值的数量,直到达到限制。 这是正确的方法吗?

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

1 个答案:

答案 0 :(得分: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;
}

每次需要扩展时,将缓冲区的大小加倍是一种常见的策略;这往往会最大限度地减少对realloc的调用次数。它还可能导致严重的内部分裂;如果你有128个元素并且你需要再存储一个,你最终会分配256个元素。您还可以延长固定金额,例如

clients *tmp = realloc( clients, sizeof *arr * ( arrSize + extent ));
if ( tmp )
{
  arr = tmp;
  arrSize += extent;
}

请注意,您不希望将realloc的结果直接分配给缓冲区;如果由于错误而返回NULL,您将丢失对已经分配的内存的引用,从而导致内存泄漏。此外,在您知道呼叫成功之前,您不希望更新阵列大小。