2013-06-22 65 views
-2

這是我的結構:表結構的分配ç

typedef struct wyraz{ 

    char *slowo; 
    char *tlumaczenie; 
    struct wyraz *nastepny; 

}WYRAZ; 

typedef struct lista_tlumaczen{ 
    char znak; 
    WYRAZ *lista_znakowa; 
}LISTA_TLUMACZEN; 

我想有這樣的事情

LISTA_TLUMACZEN tab[5]; 

,但動態分配,我不知道如何做到這一點,可以有人幫我?

+4

你用'malloc'標記了這個。所以? – 2013-06-22 19:59:58

+0

'LISTA_TLUMACZEN **標籤= malloc的(的sizeof(LISTA_TLUMACZEN *)* 5)' – Elazar

回答

0

當您嵌入指向結構的指針時,您需要考慮圖層中的內存分配。在這種情況下,首先從最高級開始效果最好。因此,開始有:

LISTA_TLUMACZEN tab[5]; 

在這裏,你是說你想p LISTA_TLUMACZEN結構的表。如果你想這是動態的,那麼你需要一個指向LISTA_TLUMACZEN

LISTA_TLUMACZEN *tab; 

然後分配它,你需要確定它有多大。在這種情況下,我們會說NUMBER_OF_ELEMENTS

tab = (LISTA_TLUMACZEN *)malloc(sizeof(LISTA_TLUMACZEN) * 5); 

如果你想成爲特別安全的malloc參數不超出範圍,你可以使用:

tab = (LISTA_TLUMACZEN *)(NUMBER_OF_ELEMENTS <= (SIZE_MAX/sizeof(LISTA_TLUMACZEN)) ? malloc(sizeof(LISTA_TLUMACZEN) * 5) : NULL); 

現在我們有動態分配相當於您的tab[5]數據聲明。請注意,這是一個LISTA_TLUMACZEN結構的表格。所以分配的內存量是5的乘積和結構的大小。

您的LISTA_TLUMACZEN結構也有一個指向另一個具有更多指針的結構的指針。您可以分配那些遵循相同類型的邏輯,或者實際上只在程序需要時才按需要分配這些邏輯,並在不再需要時釋放它們(這是進行動態分配的原因)。如果你只是預先分配一切與malloc然後沒有意義,你也可以靜態地聲明一切。

+0

INT inicializuj_liste_tlumaczen(LISTA_TLUMACZEN *** glowa) { \t INT I; \t * glowa =(LISTA_TLUMACZEN **)malloc(sizeof(LISTA_TLUMACZEN *)* ILOSC_LITER); \t \t 爲(I = 0;我

+0

@ Mr.Nimelo,您在問題陳述中更改了原始代碼,以便我的答案不再與您的問題陳述相對應。我已經糾正了我上面的迴應。您顯示的這個分配函數有一些問題。首先,你聲明的函數接受一個'LISTA_TLUMACZEN'結構作爲參數。但是你傳遞給它'LISTA_TLUMACZEN ***'(指向指向'LISTA_TLUMACZEN'的指針的指針)。您需要仔細考慮代碼,以瞭解什麼是數據,什麼是數據的指針或地址,然後使代碼相應匹配。 – lurker

+0

不要忘了,在進行乘法運算以計算malloc大小之前,您可能需要執行完整性檢查:tab =(5 <= SIZE_MAX/sizeof(LISTA_TLUMACZEN)?malloc(sizeof(LISTA_TLUMACZEN)* 5):NULL); ' – sh1