是什么导致这些默认数组值?

What causes these default array values?

我一直在研究 Kernighan/Ritchie C 编程语言书(第 2 版),在第 1.6 章第 22 页的示例中,我遇到了一些奇怪的(至少对我而言)行为基于我犯的一个错误。

错误是我声明了 int ndigit[10] 但错过了将数组中的所有整数设置为零的 for 循环。

奇怪的是数组中的前 8 个值似乎可以正常工作,默认为 0,但最后两个默认为 -373429304 和 32766。这导致程序中的数字计数功能按预期工作除了 8s 和 9s 的计数。

我发现并修复了我的错误,但我仍然很好奇为什么前 8 个值设置为 0 而后两个值却截然不同?

我会在 Martin Véronneau 的评论中添加一个很好的答案,

What happens to a declared, uninitialized variable in C? Does it have a value?)

假设您在 x86/x64 PC 上,如果您在函数内部声明 int ndigit[10],并且它存储在堆栈中。堆栈是内存的一部分,它存储您的程序之前进行的所有函数调用、return 地址、函数参数和局部变量(不是动态分配的)。

当函数 returns 时,space 通过向堆栈指针添加一个值来释放。 RAM 中的数据保留在那里。在与您调试的代码部分无关之前,代码执行中有一些零字节,并且您观察到的某些内容未归零。