所以我要在全球部分什么是未初始化的结构值?
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