2013-10-28 165 views
0

我有一个名为clients的结构体,并且我创建了这个结构体数组。动态分配结构数组

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

clients PrimaryClients[100]; 

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

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

那'malloc'呼吁*一个*'client'结构分配空间。您可能还想阅读['realloc'](http://en.cppreference.com/w/c/memory/realloc)。 –

+3

这不可能是正确的做法,因为你是铸造的malloc()''的返回值,[这是错误的(http://stackoverflow.com/questions/605845/do-i-cast-the-result -of-的malloc/605858#605858)。除此之外,你在寻找'realloc()'吗? – 2013-10-28 13:31:25

+0

同时还要注意,你不能使用'realloc()的'以[embiggen(http://en.wiktionary.org/wiki/embiggen)'PrimaryClients',因为它不与'分配的malloc()'。 – Kninnug

回答

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,那么您将失去对已分配内存的引用,导致内存泄漏。此外,您不想更新您的数组大小,直到您知道调用成功为止。

+0

有趣,接取上改编等领域,我需要使用arr->名字吧? –

+0

@ MatheusSilva:你会使用'arr [i] .name'。下标操作会隐式地提取'arr';也就是说,如果'arr'的类型是'client *',那么'arr [i]'的类型'是'client' –

+0

aparently我cliente 哈德之前一些错误,它表明我语法错误'* TMP = realloc的(客户端的sizeof(* ARR *(arrSize + 1)));',我不知道什么是错误... –