2013-02-01 72 views
4

讓我們假設,我們已經有了一個類型:指針在結構內存分配在初始化(C99)

typedef struct __BUFF_T__ 
{ 
    u_int8_t *buf; 
    u_int32_t size; 
}buff_t; 

是在C99是正確分配內存接下來呢?

buff_t a = {.size = 20,.buf = calloc(a.size,1)}; 

編譯器顯示警告

變量「數據」本身的初始設定中使用

內存可用和全時未初始化,但有一些其他非警告選項做一樣?

回答

4

從6.7.9p23:

初始化列表中的表達式的評價是不定與 對於測序,以彼此[...](152)特別地,所述評價順序不必是相同作爲子對象初始化的順序。

所以沒有保證a.size在點calloc(a.size, 1)初始化的a.buf初始化進行評估。

在這種情況下,合適的初始化將是一個創建功能:

inline buff_t create_buff(u_int32_t size) { 
    return (buff_t) {.size = size, .buf = calloc(size, 1)}; 
} 
buff_t a = create_buff(20); 

這不能用於靜態或文件範圍的對象;在這種情況下,宏將是必要的(或者,例如,可以在宏中使用的gcc語句表達式)。

3

結構沒有完全初始化,直到的a分配後,因爲你不知道在哪個爲了表達式進行評估做。

如果您需要使用結構字段來初始化同一結構中的另一個字段,則必須在單獨的步驟中完成。

+0

我認爲這個答案是錯誤的,特別是聲明:*,因爲你不知道字段將被初始化的順序*。 C說*初始化應該以初始化列表順序*出現。但是@ecatmur指出C還說,初始化列表表達式的*評估是相對於另一個而言被不確定地排序的*所以這就是爲什麼在這裏沒有指定它。 – ouah

+0

@ouah謝謝,更新了我的答案。 –