2013-10-28 205 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)));',我不知道什麼是錯誤... –