方阵的结果出乎意料吗?

时间:2016-05-20 12:39:19

标签: c arrays loops unsigned

我得到了正方形的结果

arr

我知道我达到了我的极限但是512来自哪里?您能否解释一下错误发生所涉及的所有步骤?

squares = [ 512, 1, 4, 9, 16, 25, 36, 49 ]

3 个答案:

答案 0 :(得分:1)

您正在访问超出限制的内存

for (int i = 0; i <= 8; i++) 

应该是

for (int i = 0; i <8; i++) 

请记住unsigned squares[8];允许您合法访问squares[0]squares[7]

  

我知道我达到了我的极限但是512来了   从

根据 ISO / IEC 9899:201x 6.5.10-&gt; fn109

,非法内存访问的后果未定义
  

两个对象可能在内存中相邻,因为它们是相邻的   更大阵列的元素或没有的结构的相邻成员   填充它们之间,或者因为实现选择放置   他们是这样,即使他们是无关的。如果先前无效指针   操作(例如数组边界外的访问)生成未定义   行为,后续比较也会产生不明确的行为


您可以使用调试器(例如gdb)或工具框架(例如valgrind)来查找值的来源。这里512看起来像8的立方体,但不能保证你在下次运行时会获得相同的值。更重要的是,程序可能会崩溃。

答案 1 :(得分:1)

  

我知道我达到了限制的界限

然后你应该知道后果。访问超出范围的内存会调用undefined behavior

保持在有效的内存限制内。使用

for (int i = 0; i <8; i++) 

答案 2 :(得分:1)

我会说同样的事情,就像每个人都说的那样。它是undefined behavior,您不应该这样做。

现在,您会问未定义的行为是否是发生任何事情的原因。

我会说,是的,可能。

现在,您可能认为这很容易逃避回答这个问题。

可能是,但是......

这类问题的主要问题是,很难重新创建相同的案例,并调查实际上使其行为的方式。因为未定义的行为,所以行为方式非常不明确。

这就是人们不尝试回答这类问题的原因,人们建议远离未定义的行为领域。