为什么是值
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/