4

可能重复:
C 和 C++:自动结构的部分初始化

很长一段时间我一直在使用

char array[100] = {0};

将数组的所有元素初始化为 0。但是,我最近偶然发现了一个编译器(德州仪器公司的 Code Composer Studio),它不起作用。该语句具有仅将第一个元素初始化为 0 的效果。

这种行为可能是 C 与 C++ 的差异、编译器的差异,还是实现中的错误?

4

3 回答 3

11

这只是一个错误。在 C 和 C++ 中,array都应该用零填充。


由于这是一个小答案,所以不妨过分:

C++11 §8.5.1/7:

如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从空的初始化器列表(8.5.4)中初始化。[示例:用、用和用 形式的表达式的值进行
struct S { int a; const char* b; int c; };
S ss = { 1, "asdf" };
初始化,即. —结束示例]ss.a1ss.b"asdf"ss.cint()0

C99 §6.7.8/21(对不起,没有 C11 副手):

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

于 2013-01-08T23:01:16.687 回答
5

在 C 中,没有部分初始化(参见C11 标准中的 6.7.9/19 )。一个对象要么完全初始化(它的所有字节),要么完全未初始化。

您的编译器不符合 C 标准。

初始化应按初始化程序列表顺序进行,为特定子对象提供的每个初始化程序都覆盖同一子对象的任何先前列出的初始化程序;所有未显式初始化的子对象都应隐式初始化,与具有静态存储持续时间的对象相同。

于 2013-01-08T23:04:18.067 回答
4

检查您的编译器文档。需要一个符合标准的 C 或 C++ 编译器来初始化所有元素,0但一些编译器,特别是在嵌入式世界中,具有非 ISO 选项(有时默认设置!)出于性能原因调整实现。

专门为您的编译器检查您是否处于COFF ABI 模式

6.13 COFF ABI 模式下初始化静态变量和全局变量

ANSI/ISO C 标准规定,没有显式初始化的全局(外部)和静态变量必须在程序开始运行之前初始化为 0。此任务通常在加载程序时完成。因为加载过程在很大程度上依赖于目标应用系统的特定环境,所以在 COFF ABI 模式下,编译器本身没有规定在运行时初始化为 0 否则未初始化的静态存储类变量。满足此要求取决于您的应用程序。

初始化全局对象

注意:您应该显式初始化您期望编译器默认设置为零的所有全局对象。在 C6000 EABI 模式下,未初始化的变量自动初始化为零

来自《TMS320C6000 优化编译器 v7.4 用户指南》

http://www.ti.com/lit/ug/spru187u/spru187u.pdf

于 2013-01-08T23:04:24.860 回答