堆栈上的结构 - 字段已初始化?[复制]

structure on the stack - fields initialized? [duplicate]

提问人:Mark 提问时间:10/25/2017 最后编辑:dbushMark 更新时间:10/25/2017 访问量:113

问:

请考虑以下代码:

void func()
{
   int p;
   ...
   if (p > MAX) {
       struct my_struct s;
       ...
       /* here we access the contents 's' as '&s' */
   }
}

在此代码片段中,位于堆栈上。是否保证编译器将所有结构字段初始化为零?s

c struct 初始化 自动存储

评论

2赞 yano 10/25/2017
绝对不行。自动存储不进行自动初始化c

答:

4赞 Sourav Ghosh 10/25/2017 #1

不,恰恰相反。

由于是自动存储局部范围(即块范围)变量,除非显式初始化,否则内容是不确定的。s

引用,第 §6.7.9 章C11

如果具有自动存储持续时间的对象未显式初始化,则其值为 定。[...].

但是,如果要对 an(y) 聚合类型的变量进行零初始化,则只需使用初始化语句,例如

aggregate-type variable = {0};

它使用同一章第 21 段中的以下属性,(强调我的)

如果大括号括起来的列表中的初始值设定项少于元素或成员 聚合,或用于初始化已知数组的字符串文本中的字符数较少 大小比数组中的元素多,则聚合的其余部分应为 初始化方式与具有静态存储持续时间的对象相同。

2赞 Sean 10/25/2017 #2

不,它们根本不会被初始化。结构值最终将包含放置结构的堆栈上的任何垃圾。

4赞 dbush 10/25/2017 #3

如果变量(或其他)被声明为函数或包含范围的局部变量(即具有自动存储持续时间),则不会以任何方式初始化它。您需要在 中显式设置字段。structstruct

如果初始化结构的至少一个字段,但不是全部,则其余字段的初始化方式将与文件范围变量(即具有静态存储持续时间的变量)相同,这意味着指针类型为 0,数值类型为 0。NULL

C 标准的第 6.7.9 节开始:

10 如果具有自动存储持续时间的对象未显式初始化,则其值不确定。如果一个对象 静态或线程存储持续时间未显式初始化, 然后:

— 如果它有指针类型,则初始化为空指针;

— 如果它有算术类型,则初始化为(正或无符号) 零;

— 如果是聚合,则初始化每个成员 (递归)根据这些规则,并且任何填充都会被初始化 到零位;

— 如果是工会,则第一个命名的成员是 根据这些规则进行初始化(递归),并且任何填充都是 初始化为零位;

...

21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者 用于初始化已知大小的数组的字符串文本 是数组中的元素,聚合的其余部分应为 初始化方式与具有静态存储的对象相同 期间。

评论

0赞 Mark 10/25/2017
“如果你初始化了一个结构体的至少一个字段,但不是全部,那么其余的字段将被初始化为 0”——这是 C 标准保证的吗?
0赞 Sourav Ghosh 10/25/2017
@Mark 0 或同等水平,但大多数情况下,是的,
0赞 dbush 10/25/2017
@Mark 是的。请参阅我的编辑。