我们说我有一个结构:
typedef struct{
int a;
float b;
} stuff;
如果我的代码如下:
stuff myStuff;
printf( "%d", myStuff.a ) ;
我会得到什么?该字段是否始终初始化为0?
答案 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
}