C中int数组的初始值

buz*_*ali 43 c arrays compiler-construction

在C中声明一个数组时,如下所示:

int array[10];
Run Code Online (Sandbox Code Playgroud)

整数的初始值是多少?我用不同的编译器得到了不同的结果,我想知道它是否与编译器或操作系统有关.

Ara*_*raK 61

如果在函数中声明了数组,则该值是未定义的.int x[10];在函数中意味着:在不进行任何初始化的情况下获取10-int-size memroy区域的所有权.如果将数组声明为全局数组或static函数中的数组,则如果未初始化数组,则将所有元素初始化为零.

  • 正确.除非它是全局的,否则它将包含之前记忆中的任何随机垃圾.与编译器无关.如果你想要特别的东西,那就把它放在那里. (3认同)
  • 不正确.可变范围无关紧要 - 存储类确实如此. (3认同)
  • @buzali:不,这不是你想要的.如果要将数组初始化为零,则编写`int array [10] = {0};`.让编译器自动执行只意味着您编写的代码只能在调试模式下工作,并在您释放它时中断,或者其他人使用不同的选项编译它. (3认同)
  • @buzali 一些编译器/工具链将始终将变量和分配的内存归零,最常见的是在“调试”模式下构建时(未启用优化)。这通常是为了在您对代码进行原型设计而忘记初始化变量时创建一个确定性的调试环境。另一种可能性是数组使用的内存恰好包含零。 (2认同)

qrd*_*rdl 20

由标准设置,所有全局和函数静态变量自动初始化为0.自动变量未初始化.

int a[10];  // global - all elements are initialised to 0

void foo(void) {
    int b[10];    // automatic storage - contain junk
    static int c[10]; // static - initialised to 0
}
Run Code Online (Sandbox Code Playgroud)

但是,无论其存储类如何,始终手动初始化函数变量都是一种好习惯.要将所有数组元素设置为0,您只需将第一个数组项分配给0 - 省略的元素将自动设置为0:

int b[10] = {0};
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么浪费周期来初始化一个大缓冲区是一个好习惯,在下一行中,你要加载来自文件/网络的数据. (3认同)

Dig*_*oss 12

为什么auto其他一切都没有初始化函数本地(存储类)?

C靠近硬件; 这是它最大的力量和最大的危险.究其原因auto存储类对象具有随机初始值,是因为他们在栈上分配,和设计决定不自动清除这些(部分原因是因为他们需要对每个函数调用将被清除).

另一方面,非auto对象只需要清除一次.此外,出于安全原因,操作系统必须清除已分配的页面.所以这里的设计决定是指定零初始化.为什么安全性也不是堆栈的问题?实际上它一开始就被清除了.您看到的垃圾来自您自己程序的调用框架的早期实例和它们调用的库代码.

最终结果是快速,节省内存的代码.装配的所有优点都没有痛苦.在dmr发明C之前,"HLL"就像Basic和整个操作系统内核一样,实际上是作为巨型汇编程序实现的.(在IBM这样的地方有某些例外情况.)


MSN*_*MSN 7

根据C标准,6.7.8(注10):

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.

所以这取决于编译器.使用MSVC,调试版本将使用0xcc初始化自动变量,而非调试版本将根本不初始化这些变量.


Zan*_*ynx 5

AC变量声明只是告诉编译器预留并为您命名一个内存区域.对于自动变量(也称为堆栈变量),该内存中的值不会与之前的值相同.程序启动时,全局变量和静态变量设置为零.

一些处于未优化调试模式的编译器将自动变量设置为零.但是,在较新的编译器中将值设置为已知的错误值已经变得很常见,因此程序员不会在不知不觉中编写依赖于设置为零的代码.

为了让编译器为您设置一个数组为零,您可以将其写为:

int array[10] = {0};
Run Code Online (Sandbox Code Playgroud)

更好的是使用它应该具有的值来设置数组.这样更有效,并避免两次写入数组.

  • 不要依赖编译器来初始化数组,使用像 Zan 建议的显式初始化程序。即使当前的 gcc 在某些调试模式下将数组归零,下一个模式也可能决定用完全不同的值填充它们,让您在 5 年后很难找到错误。只需输入额外的 5 个字符并使用 int array[10] = {0}; (2认同)