【问题标题】:Unsigned int field of struct got automatically initialized?结构的无符号整数字段自动初始化?
【发布时间】:2014-10-17 14:27:12
【问题描述】:

C 是否保证结构内的无符号整数字段被初始化为零?在我的系统中,似乎确实如此(或者我很“幸运”(实际上很不幸))。

用代码的话来说,下面的场景会发生什么?

struct node {
  unsigned int rec_size;
};

struct node node;
// what is the value of node.rec_size? Undefined or 0?

相关answer,但不一样,因为在我的例子中,只有一个字段,没有初始化。

【问题讨论】:

  • 视情况而定。你把它放在哪里了?
  • 好吧,想想在你生命中的某个时候你也不知道它。也许我就是这种情况,没关系。 :) 是的,我把它放在哪里都会有所作为。谢谢。 :)

标签: c struct


【解决方案1】:

答案是,它取决于存储类:

如果是_Thread_local或static,保证归零。

如果是auto或动态存储,则不进行初始化。

6.7.9 初始化

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

  • 如果有指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则进行初始化(递归), 并且任何填充都被初始化为零位;
  • 如果它是一个联合,第一个命名的成员会根据这些初始化(递归) 规则,并且任何填充都被初始化为零位;

顺便说一句:C++ 中的零初始化等同于静态/线程本地对象的那些规则。

【讨论】:

  • 是的,C 有一个auto 关键字。 stackoverflow.com/questions/2192547/…
  • auto 是关键字(在开始时为了对称而引入),标记自动存储类对象(函数本地,没有显式存储类,也就是堆栈分配)。是的,在 C++11 中,他们终于开始移除 C++ 中的那些语义,用类型推导语义替换它们(Stroustroup 早在很久以前就想在 C-with-classes 中这样做了)。
  • @wolfPack88:啊,年轻!!
【解决方案2】:

不,值未确定。

仅当变量是静态或全局变量时,值才会为 0。

【讨论】:

  • 因为引用,我接受了另一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多