在Win8中使用gcc打印越界数组元素
我正在使用代码块和mingw32-gcc.exe v.4.8.1(tdm-2)在我的m/c中编译以下代码在Win8中使用gcc打印越界数组元素,c,gcc,C,Gcc,我正在使用代码块和mingw32-gcc.exe v.4.8.1(tdm-2)在我的m/c中编译以下代码 但是在中编译相同的代码会得到正确的输出。操作系统是Win8 64位。任何解释和解决差异的帮助都将不胜感激。您所拥有的正是未定义行为的定义,特别是您试图编写的单次冒泡排序i从0到alength-1,覆盖整个数组,然后索引a[i+1],该数组将结束 如果让我具体猜测是什么导致了这种差异,一台机器在调试模式下构建,在a和b之间引入了一个哨兵,因此在一个例子中,您将a[7]与b[0](将要交换)或a
但是在中编译相同的代码会得到正确的输出。操作系统是Win8 64位。任何解释和解决差异的帮助都将不胜感激。您所拥有的正是未定义行为的定义,特别是您试图编写的单次冒泡排序
i
从0
到alength-1
,覆盖整个数组,然后索引a[i+1]
,该数组将结束
如果让我具体猜测是什么导致了这种差异,一台机器在调试模式下构建,在a
和b
之间引入了一个哨兵,因此在一个例子中,您将a[7]
与b[0]
(将要交换)或a[8]
(哨兵,通常是一个很大的数字,所以不打算交换)
TL;DR:未定义行为。您所拥有的就是未定义行为的定义,特别是您正在尝试编写的单次冒泡排序。
i
从0
到alength-1
,覆盖整个数组,然后索引a[i+1]
,这将是结束
如果让我具体猜测是什么导致了这种差异,一台机器在调试模式下构建,在a
和b
之间引入了一个哨兵,因此在一个例子中,您将a[7]
与b[0]
(将要交换)或a[8]
(哨兵,通常是一个很大的数字,所以不打算交换)
TL;DR:未定义的行为。访问绑定外的数组元素将调用未定义的行为,这将导致任何预期或意外的结果 改变
for(i = 0; i < alength; i++){
if(a[i] > a[i+1]){ ...
...
}
(i=0;i{
如果(a[i]>a[i+1]){。。。
...
}
到
(i=0;i{
如果(a[i]>a[i+1]){。。。
...
}
访问越界数组元素会调用未定义的行为,这将导致任何预期或意外的结果
改变
for(i = 0; i < alength; i++){
if(a[i] > a[i+1]){ ...
...
}
(i=0;i{
如果(a[i]>a[i+1]){。。。
...
}
到
(i=0;i{
如果(a[i]>a[i+1]){。。。
...
}
有人可能会补充说,数组大小的计算是错误的。未知的未定义行为是可预测的。除非您锁定运行该代码所涉及的每一件事,否则它是永远不可预测的,即使这样,您也只会在运行该代码后才知道它所采用的路径。@icbytesalength
的计算是正确的,b但是当写入超过数组末尾时,它可能会被覆盖。很抱歉,我无法理解。alength
的值将变为10,而不是8,这是dealbreaker。介意解释为什么会出现这种行为吗?@kaydee当循环中I==7
时,然后a[I+1]
(即a[8]
)在数组之外,因为最后一个数组元素是a[7]
。您正在覆盖数组外的一个对象,该对象恰好是您的第个
对象。您可能会补充说,数组大小的计算是错误的。未知的未定义行为是可预测的。除非您锁定运行该代码所涉及的每一件事,否则它永远都是不可预测的,即使这样,您也会运行后只需知道它所采用的路径。@icbytes计算的alength
是正确的,但当写入超过数组末尾时,它可能会被覆盖。抱歉,我无法理解。alength
的值将变为10,而不是8,这是dealbreaker。介意解释一下为什么会出现这种行为吗?@kaydee whenI==7
在循环中,然后a[i+1]
(即a[8]
)在数组之外,因为最后一个数组元素是a[7]
。您正在覆盖数组外的一个对象,该对象恰好是您的第个
对象。感谢您纠正了在访问数组越界时的错误。感谢您纠正了在访问数组越界时的错误。
for(i = 0; i < alength; i++){
if(a[i] > a[i+1]){ ...
...
}
for(i = 0; i < alength-1; i++){
if(a[i] > a[i+1]){ ...
...
}