我正在使用codeblocks和mingw32-gcc.exe v.4.8.1(tdm-2)在我的m / c中编译以下代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[8] = {3,1,10,-1,7,2,-8,1};
int b[8] = {3,1,10,-1,7,2,-8,1};
int i=0,alength = (int)sizeof(a)/sizeof(a[0]);
for(i = 0; i < alength; i++){
if(a[i] > a[i+1]){
a[i+1] = a[i] + a[i+1];
a[i] = a[i+1] - a[i];
a[i+1] = a[i+1] - a[i];
}
}
printf("Original array size is %d \n", alength);
printf("Original array elements are given below: \n");
printf("Sizeof(a) is %d \n", sizeof(a));
for(i = 0; i < alength; i++){
printf("\n b[%d] = %d", i, b[i]);
}
for(i = 0; i < alength; i++){
printf("\na[%d] = %d", i, a[i]);
}
}
它给了我以下输出。这里为每个阵列打印两个额外的元素。
Original array size is 10
Original array elements are given below:
Sizeof(a) is 32
b[0] = 3
b[1] = 1
b[2] = 10
b[3] = -1
b[4] = 7
b[5] = 2
b[6] = -8
b[7] = 1
b[8] = 1
b[9] = 3
a[0] = 1
a[1] = 3
a[2] = -1
a[3] = 7
a[4] = 2
a[5] = -8
a[6] = 1
a[7] = 8
a[8] = 10
a[9] = 9
但是在online compiler中编译相同的代码会得到正确的输出。操作系统是Win8 64位。任何解释和解决差异的帮助都将受到赞赏..
答案 0 :(得分:5)
访问out of bound数组元素会调用未定义的行为,这将导致任何预期或意外的结果。
更改
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]){ ...
...
}
答案 1 :(得分:4)
您所拥有的是未定义行为的定义,特别是您尝试编写的一次通过冒泡行为。 i
从0
转到alength-1
,覆盖整个数组,然后编制索引a[i+1]
,这将超过结束。
如果我必须具体猜测导致差异的是什么,一台机器正在调试模式下构建,在a
和b
之间引入一个标记,所以在一个实例中你要比较a[7]
使用b[0]
(将要交换)或使用a[8]
(哨兵,通常是一个很大的数字,所以不会交换)。
TL; DR:未定义的行为。