c - C 中 int 数组的初始值 - 为什么?

标签 c arrays

为什么是值

int array[10];

在函数中声明时未定义,声明为 static 时为 0

我一直在看this question的答案很明显

[the expression int array[10];] in a function means: take the ownership of 10-int-size area of memory without doing any initialization. If the array is declared as a global one or as static in a function, then all elements are initialized to zero if they aren't initialized already.

问题:为什么会出现这种行为?编译器程序员是否决定(出于特定原因)?所使用的特定编译器能否以不同的方式执行操作?

我为什么问这个问题:我问这个问题是因为我想让我的代码在架构/编译器之间可移植。为了确保这一点,我知道我总是可以初始化声明的数组。但这意味着我将浪费宝贵的时间只为这次手术。那么,哪个是正确的决定?

最佳答案

自动 int array[10]; 不会隐式归零,因为归零需要时间,而且您可能不需要将其归零。此外,您不仅要支付一次费用,而且每次控制运行经过初始化变量时都要支付费用。

静态/全局 int array[10]; 隐式归零,因为静态/全局是在加载时分配的。内存将从操作系统中刷新,如果操作系统完全具有安全意识,内存将已经清零。否则加载代码(操作系统或动态链接器)将不得不将它们置零(因为 C 标准需要它),但它应该能够在一次调用 memset 中为所有全局变量/statics,这比一次将每个静态/全局变量归零更有效。

这个初始化只做一次。即使函数内部的 static 也只初始化一次,即使它们有非零初始化器(例如,static int x = 42;)。这就是为什么 C 要求初始化器a static 是常量表达式)。

由于所有全局变量/静态变量的加载时间归零是操作系统保证的或可有效实现的,因此它也可能是标准保证的,从而使程序员的工作更轻松。

关于c - C 中 int 数组的初始值 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871827/

相关文章:

c - 长串错误的Atoi

c - 关于 "C"中的 Prime Generation - 我的代码有什么问题? -

javascript - 搜索数组并制作找到和未找到单词的编号列表,Javascript

c++ - 用常量值填充 std::vector<double>

c - 指向 char 数组的指针数组

c - 为什么这个程序在这个队列程序中给出段错误

c - 在 printf 参数中提升类型是否危险?

javascript - 如何将数组作为 JavaScript 中的新属性推送到另一个数组元素中?

c++ - 将整数值分配给 char 数组元素

javascript - 将 2D 圆表示为 1D 数组(出租车几何、冯诺依曼邻域)