在Win8中使用gcc打印越界数组元素

在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

我正在使用代码块和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[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]){。。。 ... }
有人可能会补充说,数组大小的计算是错误的。未知的未定义行为是可预测的。除非您锁定运行该代码所涉及的每一件事,否则它是永远不可预测的,即使这样,您也只会在运行该代码后才知道它所采用的路径。@icbytes
alength
的计算是正确的,b但是当写入超过数组末尾时,它可能会被覆盖。很抱歉,我无法理解。
alength
的值将变为10,而不是8,这是dealbreaker。介意解释为什么会出现这种行为吗?@kaydee当循环中
I==7
时,然后
a[I+1]
(即
a[8]
)在数组之外,因为最后一个数组元素是
a[7]
。您正在覆盖数组外的一个对象,该对象恰好是您的
第个
对象。您可能会补充说,数组大小的计算是错误的。未知的未定义行为是可预测的。除非您锁定运行该代码所涉及的每一件事,否则它永远都是不可预测的,即使这样,您也会运行后只需知道它所采用的路径。@icbytes计算的
alength
是正确的,但当写入超过数组末尾时,它可能会被覆盖。抱歉,我无法理解。
alength
的值将变为10,而不是8,这是dealbreaker。介意解释一下为什么会出现这种行为吗?@kaydee when
I==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]){ ...
        ...
 }