【问题标题】:C90 - initializing arrays in global and in function scopeC90 - 在全局和函数范围内初始化数组
【发布时间】:2017-12-24 22:13:32
【问题描述】:

我想知道在全局范围和函数范围内初始化数组一次的属性。

让我们说:

char arr[4];

int main() {
    .....
}

这个数组中的值是什么?

这个选项有什么作用:

int main() {
    char arr[4];
    ....
}

最后一种情况和这个有什么区别吗:

int main() {
    ....
}

int func1() {
    char arr[4];
    ....
}

结果会在不同的编译器中改变吗? 谢谢

【问题讨论】:

  • (1) 零 (2) 不确定 (3) 否。
  • 函数块中声明的变量会在函数结束时超出作用域。
  • 在线查看一些function scope 教程
  • 就这个问题的详细程度而言,C90 与准标准 C 或 C99 或 C11 之间没有区别。其他数组初始化上下文(指定的初始化程序,本地数组初始化程序中的函数调用等)存在差异,但就这么多,没有区别。请注意,某些平台可能会将本地数组初始化为零,特别是如果它们位于 main() 中,但您不能依赖它——这些值是不确定的。

标签: c arrays ansi-c


【解决方案1】:

在一个规范的系统中,文件范围数组将被初始化为全零。函数内数组的可预测性较差;很有可能它只会继承当时堆栈中的任何 scud。

一般来说,可以安全地假设为桌面系统编译的任何现代工具链都将是“有礼貌的”,但如果是针对嵌入式系统,您可能需要自行检查 bss 部分是否被初始化为全为零。该初始化是处理器(或有时是板)特定支持包的一部分,您不能总是相信它已经完成。

【讨论】:

  • 静态生命周期变量的零初始化是标准规定的,与 QoI 无关。
  • 不知道你所说的“Qol”是什么意思,但我使用过很多不遵守标准的小工具链,或者被一些个人开发者截断劫持了初始化代码。标准是美妙的东西,但它们就像速度限制——你不能相信个人(甚至制造处理器的公司)会遵守它们。
  • QoI = 实施质量。 2017 年只有 C90 的实现可能不应该被信任以遵循以下标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多