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

标签 c arrays int kernighan-and-ritchie

我一直在阅读 Kernighan/Ritchie C 编程语言书籍(第 2 版),在第 1.6 章第 22 页的示例中,我遇到了一些基于我所犯错误的奇怪行为(至少对我来说) .

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

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

我解决了我的错误并修复了它,但我仍然很好奇为什么前 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],并且它存储在堆栈中。堆栈是内存的一部分,它存储程序之前进行的所有函数调用、返回地址、函数参数和局部变量(不是动态分配的)。

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

关于c - 是什么导致了这些默认数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50065510/

相关文章:

c - 在程序中运行程序

c - 为什么不能使用指向 char 指针的指针而不是 char 指针数组?

javascript - 根据属性值限制数组中的对象

c# - 如何在 C# 中将格式化字符串转换为 int(如果我知道格式)?

c - c 中的 fread 循环计数器缺少奇数

列表前后的 C 枚举标签 - 类型还是变量名称?

c++ - 为什么在 C++ 3d 数组列表分配中需要额外的括号?

c# - C#中字符串数组的自定义排序

从uchar到int的C++数据打包(包括正数和负数)

java - int 可以增加一个 double 值