【发布时间】:2009-12-29 12:48:23
【问题描述】:
在 C 语言中,我读到一半初始化的数组将用零填充其余元素(无论整数或字符数组)。
例如:
int arr[10] = {3};
arr[4] 如果已初始化,则为 0,如果未初始化,则为垃圾值。
我的问题是,以上内容是否适用于所有 C 编译器(或)根据编译器选项,可能会发生或不发生这种附加零?我在代码作曲家工作室(TI 的 IDE)工作。我想确保这适用于所有情况和所有编译器。
【问题讨论】:
在 C 语言中,我读到一半初始化的数组将用零填充其余元素(无论整数或字符数组)。
例如:
int arr[10] = {3};
arr[4] 如果已初始化,则为 0,如果未初始化,则为垃圾值。
我的问题是,以上内容是否适用于所有 C 编译器(或)根据编译器选项,可能会发生或不发生这种附加零?我在代码作曲家工作室(TI 的 IDE)工作。我想确保这适用于所有情况和所有编译器。
【问题讨论】:
行为由 C 标准指定。但是,如果您担心特定编译器的行为,为什么不写一个测试呢?
【讨论】:
这是根据 C 标准,任何遵循 C 标准的编译器都必须这样做。但是,并非所有编译器都 100% 符合标准,如果您不确定,则必须检查您的编译器是否这样做。
【讨论】:
位于数据段(全局和单元范围)中的变量会自动初始化为全零。
除非显式初始化,甚至部分初始化,否则堆栈变量(函数和块范围)会被垃圾填充。在部分初始化的情况下,提醒归零。
这是 C 标准,所有编译器都必须遵守。
【讨论】:
int arr[10] = {3};,那么arr[4] 没有显式初始化并且不是垃圾,即使 arr 是函数中的自动变量。
无论您使用哪种编译器,这都应该有效。
【讨论】:
如果您想确保您的代码适用于所有编译器,您应该像这样初始化所有数组元素:
int arr[10] = {3,0,0,0,0,0,0,0,0,0};
如果数组的元素数量过多(100 或 10000),最好的解决方案是在运行时动态初始化它。
【讨论】:
这取决于编译器的设计。通常编译器支持它,有些可能在编译期间通过一些标志或其他选项支持。有些人可能不支持。最好检查相关的编译器支持 regd 与 C 标准的兼容性。我认为 Code Composer Studio IDE(TI DSP 处理器)支持小组可能会给您确切的答案。
卡提克·巴拉古鲁
【讨论】:
语言规范指定了默认行为,但并非所有编译器都实现了定义的行为。一个很好的例子是,Visual Studio 2008 是 Microsoft C/C++ 编译器的第一个版本,它将调用数组中未初始化元素的默认构造函数,这至少从 C++ 98 规范开始就是数组初始化的定义行为。
如果您担心您的代码在多个编译器上运行时的行为方式,最好是安全而不是抱歉,并明确初始化所有值。
【讨论】: