我得到了正方形的结果
arr
。
我知道我达到了我的极限但是512来自哪里?您能否解释一下错误发生所涉及的所有步骤?
squares = [ 512, 1, 4, 9, 16, 25, 36, 49 ]
答案 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)
答案 2 :(得分:1)
我会说同样的事情,就像每个人都说的那样。它是undefined behavior,您不应该这样做。
现在,您会问未定义的行为是否是发生任何事情的原因。
我会说,是的,可能。
现在,您可能认为这很容易逃避回答这个问题。
可能是,但是......
这类问题的主要问题是,很难重新创建相同的案例,并调查实际上使其行为的方式。因为未定义的行为,所以行为方式非常不明确。
这就是人们不尝试回答这类问题的原因,人们建议远离未定义的行为领域。