【问题标题】:Initialization of arrays in CC中数组的初始化
【发布时间】:2009-12-29 12:48:23
【问题描述】:

在 C 语言中,我读到一半初始化的数组将用零填充其余元素(无论整数或字符数组)。

例如:

int arr[10] = {3};

arr[4] 如果已初始化,则为 0,如果未初始化,则为垃圾值。

我的问题是,以上内容是否适用于所有 C 编译器(或)根据编译器选项,可能会发生或不发生这种附加零?我在代码作曲家工作室(TI 的 IDE)工作。我想确保这适用于所有情况和所有编译器。

【问题讨论】:

标签: c arrays embedded


【解决方案1】:

行为由 C 标准指定。但是,如果您担心特定编译器的行为,为什么不写一个测试呢?

【讨论】:

  • 如果您知道代码可能使用了哪些编译器,那么测试是个好主意。如果您担心未来工作的编译器之间的可移植性,这可能会更加困难;-)。
【解决方案2】:

这是根据 C 标准,任何遵循 C 标准的编译器都必须这样做。但是,并非所有编译器都 100% 符合标准,如果您不确定,则必须检查您的编译器是否这样做。

【讨论】:

    【解决方案3】:

    位于数据段(全局和单元范围)中的变量会自动初始化为全零。

    除非显式初始化,甚至部分初始化,否则堆栈变量(函数和块范围)会被垃圾填充。在部分初始化的情况下,提醒归零。

    这是 C 标准,所有编译器都必须遵守。

    【讨论】:

    • 不正确,请参阅 C99 6.7.8/21 “如果大括号括起来的列表中的初始化程序比元素或成员的数量少.. 其余部分.. 应与对象隐式初始化相同具有静态存储持续时间。” (大致意思是归零)
    • @Pate:感谢 C 标准参考,Pate.. 是否有任何标准站点可供我查看标准,以供将来参考
    • @Roger 是的,完全正确。我的帖子与它有何矛盾?
    • inquisitive:有一些书在学习语言基础知识时可以提供更好的参考;我没有引用标准来回答你是有原因的,但确实向 qrdl 指出了错误。即便如此,您也可以通过open-std.org/jtc1/sc22/wg14/www/standards.html 找到它。
    • qrdl:给定int arr[10] = {3};,那么arr[4] 没有显式初始化并且不是垃圾,即使 arr 是函数中的自动变量。
    【解决方案4】:

    无论您使用哪种编译器,这都应该有效。

    【讨论】:

      【解决方案5】:

      如果您想确保您的代码适用于所有编译器,您应该像这样初始化所有数组元素:

      int arr[10] = {3,0,0,0,0,0,0,0,0,0};
      

      如果数组的元素数量过多(100 或 10000),最好的解决方案是在运行时动态初始化它。

      【讨论】:

      • 除非您正在开发一个嵌入式项目,其中有人修改了启动代码以删除启动初始化(根据经验)。那么所有的赌注都是为了便携性!
      • 可以理解您的评论。看来你同意我的提议。我说的对吗?
      【解决方案6】:

      这取决于编译器的设计。通常编译器支持它,有些可能在编译期间通过一些标志或其他选项支持。有些人可能不支持。最好检查相关的编译器支持 regd 与 C 标准的兼容性。我认为 Code Composer Studio IDE(TI DSP 处理器)支持小组可能会给您确切的答案。

      卡提克·巴拉古鲁

      【讨论】:

        【解决方案7】:

        语言规范指定了默认行为,但并非所有编译器都实现了定义的行为。一个很好的例子是,Visual Studio 2008 是 Microsoft C/C++ 编译器的第一个版本,它将调用数组中未初始化元素的默认构造函数,这至少从 C++ 98 规范开始就是数组初始化的定义行为。

        如果您担心您的代码在多个编译器上运行时的行为方式,最好是安全而不是抱歉,并明确初始化所有值。

        【讨论】:

          猜你喜欢
          • 2013-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 2010-09-14
          • 2010-12-18
          • 1970-01-01
          相关资源
          最近更新 更多