未初始化时结构中的值是什么?

时间:2014-07-31 20:42:35

标签: c struct

我们说我有一个结构:

typedef struct{
   int a;
   float b;
} stuff;

如果我的代码如下:

stuff myStuff;
printf( "%d", myStuff.a ) ;

我会得到什么?该字段是否始终初始化为0?

3 个答案:

答案 0 :(得分:3)

在C11中,未显式初始化的任何结构成员(就像您的情况一样)具有不确定值。 C11 6.7.9 / 10:

  

如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。

读取这样一个不确定的值会产生未定义的行为。 C11 6.3.2.1/2:

  

如果   左值指定了一个自动存储持续时间的对象   使用register存储类声明(从未使用过地址)和该对象   未初始化(未使用初始化程序声明,并且没有对其进行任何分配)   在使用之前执行),行为未定义。

最后,附件J.2(未定义的行为)阐明了这一点:

  

在以下情况下,行为未定义:

     
      
  • 使用具有自动存储持续时间的对象的值   不确定(6.2.4,6.7.9,6.8)。
  •   

答案 1 :(得分:2)

没有。该领域可以有任何价值。做这样的事情被认为是一个错误,因为价值是不可预测的。

答案 2 :(得分:1)

取决于结构的对象是具有静态存储持续时间还是本地对象。如果结构的对象具有静态存储持续时间,则其所有数据成员将由零初始化。否则该对象将不会被初始化。

例如

#include <stdio.h>

typedef struct
{
    int a;
    float b;
} stuff;

stuff s1; // initialized by zeroes

int main( void )
{
    stuff s2;     //indetermined values

    printf( "%d\n", s1.a ) ;  // 0 will be outputed
    printf( "%d\n", s2.a ) ;  // any value can be outputed
}