C 我的未初始化结构值是多少?
所以我在全局部分有两个结构C 我的未初始化结构值是多少?,c,C,所以我在全局部分有两个结构 typedef struct stack_1 { short ctr; } stack_1; typedef struct stack_2 { struct stack_1 *s1; } stack_2; 然后在后面的代码中我会这样做 struct stack_2 *x; 我的x初始化为什么??0或Null。先谢谢你 如果您的声明在任何函数之外或带有static关键字(更准确地说,具有静态存储持续时间),则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或Null。先谢谢你 如果您的声明在任何函数之外或带有
static
关键字(更准确地说,具有静态存储持续时间),则x的初始值是一个空指针(可以写成0
或null
)。如果它位于函数内部(更准确地说,具有自动存储持续时间),则其初始值为垃圾。在局部变量声明之后
struct stack_2 *x;
x
是未初始化(悬挂)的指针。它有垃圾值,指向内存中的某个随机位置。取消对它的引用将是未定义的行为,即您应该不惜一切代价避免的行为。- 如果声明是本地的,则
保存垃圾值x
- 如果声明是全局的,则
保持0x
stack_2 *x;
x
的值取决于上述代码的位置。如果是全局x
将设置为0。如果它是函数中的局部变量,x
将被取消初始化。在代码中,局部还是全局。谁知道呢?很可能它指向了后台进程;在代码中是本地的。@ken,现在它肯定是指向后台进程的。。)您应该始终执行以下操作:堆栈_2*x=NULL;除非它具有静态存储持续时间,在这种情况下,它被初始化为0(又称NULL)@bdonlan,否则OP声明它是一个局部变量。您不必总是初始化它;例如,如果你做了some_type*ptr;如果(某物)ptr=这个;否则ptr=该值代码>。尽管有些人会争辩说总是初始化是一种好的风格。@mydogisbox:不,你应该在使用指针之前理解它们。使用NULL的无意义初始化实际上隐藏了错误(如果您使用变量而没有实际初始化它,编译器将不再警告您),并使读者质疑为什么在程序中包含“死代码”(可能在某些情况下实际使用了初始值?)静态存储持续时间也可以在函数中。@Eric:很好,已更新。(我本想用“更精确地”一词来涵盖这一点,但我本应该更明确一些。)将该类型称为struct stack_2
或stack_2
是合法的。但是如果你想把它称为struct stack_2
,那么typedef
就没用了。@Keith Thompson我知道任何一种方法都是合法的,这就是为什么我说应该而不是必须:-)我自己的偏好是去掉typedef
,将类型称为struct stack_2
。