所以我要在全球部分什麼是未初始化的結構值?
typedef struct stack_1
{
short ctr;
} stack_1;
typedef struct stack_2
{
struct stack_1 *s1;
} stack_2;
兩個結構然後在後面的代碼我做
struct stack_2 *x;
什麼是我的X初始化爲? 0或空值。先謝謝你。
所以我要在全球部分什麼是未初始化的結構值?
typedef struct stack_1
{
short ctr;
} stack_1;
typedef struct stack_2
{
struct stack_1 *s1;
} stack_2;
兩個結構然後在後面的代碼我做
struct stack_2 *x;
什麼是我的X初始化爲? 0或空值。先謝謝你。
如果您的聲明超出了任何函數或static
關鍵字(更確切地說,具有靜態存儲持續時間),則x的初始值爲空指針(可能爲0
或NULL
)。如果它在一個函數內(更準確地說,具有自動存儲持續時間),它的初始值是垃圾。
靜態存儲時間也可以在函數內。 –
@Eric:好點,更新。 (我打算用「更精確」來說明這一點,但我應該更加明確。) –
的局部變量聲明
struct stack_2 *x;
x
之後是一個未初始化的(懸空)指針。它有垃圾值,指向內存中的某個隨機位置。提領它將是未定義的行爲,即您應該不惜一切代價避免的東西。
你應該總是碰到stack_2 * x = NULL;或者其他一些。 – mydogisbox
除非它有靜態存儲持續時間,在這種情況下,它被初始化爲0(又名NULL) – bdonlan
@bdonlan,OP聲明它是一個局部變量。 –
x
持有垃圾值x
持有0既然你typedef
倒是結構的名字,你應該初始化它如下:
stack_2 *x;
x
的值取決於上面代碼的位置i位於。如果它是全局的,則x
將被設置爲0.如果它是一個函數內的局部變量,則x
將被初始化。
將這種類型稱爲「struct stack_2」或「stack_2」是合法的。但是,如果你打算把它叫做'struct stack_2',那'typedef'就沒有用了。 –
@Keith Thompson我知道任何一種方式都是合法的,這就是爲什麼我說*應該*而不是*必須* :-) – Praetorian
我自己的選擇是放棄'typedef'並將類型稱爲'struct stack_2'。 –
其中在代碼中,本地或全局。 – phoxis
誰知道?它很可能是指向鼻子守護進程。 – Nim
struct stack_2 * x;在代碼中是本地的。 – ken