【问题标题】:What causes these default array values?是什么导致这些默认数组值?
【发布时间】:2018-04-27 15:18:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 未初始化的局部非静态变量(包括数组)实际上是未初始化的。它们的值将是不确定的(并且看起来是随机的)。
  • 您可以检查那个出色的答案。它是关于一个整数,但它适用于数组。 stackoverflow.com/questions/1597405/…
  • "错误是我声明了 int ndigit[10] 但错过了将数组中的所有整数设置为零的 for 循环。" int ndigit[10] = {0}; 强制“默认初始化”所有您没有为其提供初始化程序的元素 - 也就是将它们设置为 0

标签: c arrays int kernighan-and-ritchie


【解决方案1】:

我会在 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 指定的。使用示例嵌入式编译器,main() 中的 int ndigit[10] 与其他全局变量一起存储。这完全取决于编译器。,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多