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
    保存垃圾值
  • 如果声明是全局的,则
    x
    保持0

既然您已经定义了结构名称,那么您应该按如下方式实例化它:

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