2011-08-22 108 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'。 –