提问人:Mark 提问时间:10/25/2017 最后编辑:dbushMark 更新时间:10/25/2017 访问量:113
堆栈上的结构 - 字段已初始化?[复制]
structure on the stack - fields initialized? [duplicate]
问:
请考虑以下代码:
void func()
{
int p;
...
if (p > MAX) {
struct my_struct s;
...
/* here we access the contents 's' as '&s' */
}
}
在此代码片段中,位于堆栈上。是否保证编译器将所有结构字段初始化为零?s
答:
不,恰恰相反。
由于是自动存储局部范围(即块范围)变量,除非显式初始化,否则内容是不确定的。s
引用,第 §6.7.9 章C11
如果具有自动存储持续时间的对象未显式初始化,则其值为 定。[...].
但是,如果要对 an(y) 聚合类型的变量进行零初始化,则只需使用初始化语句,例如
aggregate-type variable = {0};
它使用同一章第 21 段中的以下属性,(强调我的)
如果大括号括起来的列表中的初始值设定项少于元素或成员 聚合,或用于初始化已知数组的字符串文本中的字符数较少 大小比数组中的元素多,则聚合的其余部分应为 初始化方式与具有静态存储持续时间的对象相同。
不,它们根本不会被初始化。结构值最终将包含放置结构的堆栈上的任何垃圾。
如果变量(或其他)被声明为函数或包含范围的局部变量(即具有自动存储持续时间),则不会以任何方式初始化它。您需要在 中显式设置字段。struct
struct
如果初始化结构的至少一个字段,但不是全部,则其余字段的初始化方式将与文件范围变量(即具有静态存储持续时间的变量)相同,这意味着指针类型为 0,数值类型为 0。NULL
从 C 标准的第 6.7.9 节开始:
10 如果具有自动存储持续时间的对象未显式初始化,则其值不确定。如果一个对象 静态或线程存储持续时间未显式初始化, 然后:
— 如果它有指针类型,则初始化为空指针;
— 如果它有算术类型,则初始化为(正或无符号) 零;
— 如果是聚合,则初始化每个成员 (递归)根据这些规则,并且任何填充都会被初始化 到零位;
— 如果是工会,则第一个命名的成员是 根据这些规则进行初始化(递归),并且任何填充都是 初始化为零位;
...
21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者 用于初始化已知大小的数组的字符串文本 是数组中的元素,聚合的其余部分应为 初始化方式与具有静态存储的对象相同 期间。
评论
上一个:在应释放其内存后访问可变长度数组
评论
c