在Win8中使用gcc打印出的数组元素

时间:2014-12-30 13:27:08

标签: c gcc

我正在使用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位。任何解释和解决差异的帮助都将受到赞赏..

2 个答案:

答案 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)

您所拥有的是未定义行为的定义,特别是您尝试编写的一次通过冒泡行为。 i0转到alength-1,覆盖整个数组,然后编制索引a[i+1],这将超过结束。

如果我必须具体猜测导致差异的是什么,一台机器正在调试模式下构建,在ab之间引入一个标记,所以在一个实例中你要比较a[7]使用b[0](将要交换)或使用a[8](哨兵,通常是一个很大的数字,所以不会交换)。

TL; DR:未定义的行为。