为什么我的代码有效? C中的数组排序

时间:2015-05-26 21:40:56

标签: c arrays sorting

我编写了用于对数组元素进行排序的代码。它工作正常,但我不明白为什么它的工作原理。我预计会出现IndexOutOfBounds错误。但没有任何类似的事情发生。我以为我“不得不”使用

  

SIZE - 1 //在for循环中,但即使是SIZE也能正常工作。这是我的问题

Array index out of bound in C中的问题并没有清楚地解释为什么我在排序数组后得到正确的结果。 下面是代码:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 12     //  definition
int main(int argc, char *argv[])
{
    int a[ SIZE ] = {12, 9, 10, 7, 6, 8, 5, 1, 3, 2, 4, 11};
    int i;
    int j;
    for( i = 0; i < SIZE; i++ ) 
    {
        for (  j = 0; j < SIZE; j++ )  // why not SIZE - 1 ????
        {
            if( a[j] > a[j + 1])
            {
                int hold = a[ j ];
                a[ j ] = a[ j + 1 ];
                a[ j + 1] = hold;
            }
        }
    }
    for( i=0; i < SIZE; i++ )
    {
        printf( "%4d", a[ i ] );
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

C不会检查数组边界,因此只要您有权访问最后一项,它就会顺便运行。

但是,如果您更频繁地运行此代码,则可能会遇到其他错误。由于您正在更改不属于该阵列的内存,因此您可能会获得各种(非)预期行为。是的,Qix,包括访问冲突:)

由于示例数组中的值非常低,因此额外int中的值较高的可能性很高。如果是这样,它将保留在数组的末尾,并且它永远不会被覆盖。从这段代码中得到任何错误可能需要很长时间,但最终你可能会这样做。

所以,有时它会起作用,有时则不行。这也与您的应用程序的其余部分以及那里的数据类型有关。可能是你从来没有(或几乎从不)得到错误,然后你做了一个改变并重新编译,然后突然你会得到它。此外,您可能会意外更改内存(交换最后一项),这会给您一个不正确的数组(一个项目被另一个项目替换),这可能会导致奇怪的情况,因为您还更改了其他变量中的值。

因此,长话短说,很难预测究竟会发生什么。

答案 1 :(得分:1)

您可能正在获取已排序的值。但是,没有人可以确保您将获得始终排序的值或一组值作为初始化数组。

访问C中的超出内存是不确定的行为。即使在您的情况下,当您访问保留内存的下一个位置并使用它来交换索引SIZESIZE+1的值时。因此,如果你仔细检查输出,你可能会得到排序的数组(幸运的是),但你必须看到在初始化数组中可能没有的一个元素。