2011-08-22 51 views
1

所以我要在全球部分什麼是未初始化的結構值?

typedef struct stack_1 
{ 
    short ctr; 
} stack_1; 

typedef struct stack_2 
{ 
    struct stack_1 *s1; 
} stack_2; 

兩個結構然後在後面的代碼我做

struct stack_2 *x; 

什麼是我的X初始化爲? 0或空值。先謝謝你。

+0

其中在代碼中,本地或全局。 – phoxis

+1

誰知道?它很可能是指向鼻子守護進程。 – Nim

+0

struct stack_2 * x;在代碼中是本地的。 – ken

回答

10

如果您的聲明超出了任何函數或static關鍵字(更確切地說,具有靜態存儲持續時間),則x的初始值爲空指針(可能爲0NULL)。如果它在一個函數內(更準確地說,具有自動存儲持續時間),它的初始值是垃圾。

+0

靜態存儲時間也可以在函數內。 –

+0

@Eric:好點,更新。 (我打算用「更精確」來說明這一點,但我應該更加明確。) –

0

的局部變量聲明

struct stack_2 *x; 

x之後是一個未初始化的(懸空)指針。它有垃圾值,指向內存中的某個隨機位置。提領它將是未定義的行爲,即您應該不惜一切代價避免的東西。

+0

你應該總是碰到stack_2 * x = NULL;或者其他一些。 – mydogisbox

+0

除非它有靜態存儲持續時間,在這種情況下,它被初始化爲0(又名NULL) – bdonlan

+1

@bdonlan,OP聲明它是一個局部變量。 –

0
  • 如果聲明是本地的,那麼x持有垃圾值
  • 如果聲明是全球性的,那麼x持有0
0

既然你typedef倒是結構的名字,你應該初始化它如下:

stack_2 *x; 

x的值取決於上面代碼的位置i位於。如果它是全局的,則x將被設置爲0.如果它是一個函數內的局部變量,則x將被初始化。

+0

將這種類型稱爲「struct stack_2」或「stack_2」是合法的。但是,如果你打算把它叫做'struct stack_2',那'typedef'就沒有用了。 –

+0

@Keith Thompson我知道任何一種方式都是合法的,這就是爲什麼我說*應該*而不是*必須* :-) – Praetorian

+0

我自己的選擇是放棄'typedef'並將類型稱爲'struct stack_2'。 –