2012-03-09 91 views
1

我是C新手,對初始化結構有疑問。我正在使用我還沒有創建的結構,所以我不知道里面有什麼。因此,我沒有初始化它,但編譯器抱怨。所以我把它設置爲NULL,但我得到了分段錯誤。然後,我查找了如何將所有內容都設置爲0,並將其設置爲等於{0}。這也給我一個分段錯誤。因爲我知道我所調用的函數是正確的,而且我傳遞它的數組的大小是正確的,我幾乎可以肯定它與我初始化結構的方式有關。初始化是在C中初始化結構 - 避免分段錯誤

struct aes_ctx *aes_struct = {0} 

該函數的頭是

void aes_setkey(aes_ctx *aes, const void *key, u_int len); 

,我稱它是

aes_setkey(aes_struct, aes, CCA_STRENGTH); 

其中AES是大小16的緩衝方式,CCA_STRENGTH是常量int爲16.

爲了總結這個問題,我認爲我初始化結構體c的方式使它稍後無法使用。任何可以給我的幫助,這將是如此讚賞! 謝謝!

+2

關鍵的一點是,你的代碼不分配一個結構,它分配一個指向結構。這是您在開始初始化之前需要專注於理解的內容。 – 2012-03-09 18:20:08

+0

http://www.scs.stanford.edu/nyu/05sp/lab/lab1.html? – 2012-03-09 18:22:27

回答

5

你不能初始化指針這樣(你可以,它只是不指向anythign有效)。像這樣的東西是你所追求的:

struct aes_ctx aes_struct = {0}; 

可以再通aes_struct給函數的地址,而是取決於你是否需要動態分配這件事情(需要的範圍和的大小類型將決定這一點)。

所以......

struct aes_ctx aes_struct = {0}; 
aes_setkey(&aes_struct, aes, CCA_STRENGTH); 

或者

struct aes_ctx *aes_struct = malloc(sizeof(struct aes_ctx)); 
/* you may want to initialize the structure via memset or some init function */ 
aes_setkey(aes_struct, aes, CCA_STRENGTH); 
+0

'struct aes_ctx * aes_struct = {0}'是完全有效的C,請參閱我的答案。 – ouah 2012-03-09 19:15:01

+1

@ouah:對,除非你想要,實際上使用這個東西。你當然在技術上是正確的,0是一個有效的值,但我試圖回答這個問題的精神,這是告訴OP如何做到這一點。他正在調用的函數需要一個有效的指針。 – 2012-03-09 20:07:52

+0

你錯過了我的觀點。很多人都認爲'T * p = {0}'形式在包含大括號的時候是無效的,我想說明這是完全有效的。評論不是針對OP,而是針對您的回答。 – ouah 2012-03-09 23:30:36

2

的關鍵是,你不初始化結構,而是一個指針。這意味着你正在做的是將指針設置爲無效地址,當它嘗試訪問該地址時會導致seg錯誤。你要麼需要分配內存:

struct aes_ctx* aes_struct = malloc(sizeof(struct aes_ctx)); 

或創建實際的結構(不是指針),並通過該地址:

struct aes_ctx aes_struct = {0}; 
aes_setkey(&aes_struct, aes, CCA_STRENGTH); 
2

你不分配內存的指針指向。您可以使用

struct aes_ctx aes_struct = {0}; // Declare the struct, not a pointer to it 
aes_setkey(&aes_struct, aes, CCA_STRENGTH); 

或者,如果你要動態分配內存,

struct aes_ctx *aes_struct = malloc(sizeof(struct aes_ctx)); 
memset(aes_struct, 0, sizeof(struct aes_ctx); // Only if you need to zero the data 
aes_setkey(aes_struct, aes, CCA_STRENGTH); 
+0

是的。固定。 :-) – 2012-03-09 18:23:05

1
struct aes_ctx *aes_struct = {0}; 

這樣你實際上是初始化aes_struct指針0

兩個初始化:

struct aes_ctx *aes_struct = {0}; 

struct aes_ctx *aes_struct = 0; 

是等價的。 C表示在初始化標量時可以添加可選的{}。所以基本上你並沒有初始化指向一個結構的成員,它的成員初始化爲零,但是你正在用一個空指針常量初始化指針。

雖然,你可以一次性使用複合文字執行前:

struct aes_ctx *aes_struct = (struct aes_ctx) {0}; 
+0

你最後兩行混淆了我。這與簡單的'struct aes_ctx * aes_struct = 0;'有什麼不同?你還沒有爲它分配內存。 – 2012-03-09 19:09:31

+0

'(){}'是複合文字操作符(在c99中引入)。在我的最後一個例子中,指針指向一個結構對象,其成員初始化爲'0'。在我的其他例子中,指針並不指向任何結構對象:指針值是一個空指針常量。 – ouah 2012-03-09 19:12:45

+0

那麼它指向堆棧上的一個結構,或者是否有一些malloc魔法正在進行? – 2012-03-09 19:14:34