我编写了用于对数组元素进行排序的代码。它工作正常,但我不明白为什么它的工作原理。我预计会出现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;
}
答案 0 :(得分:3)
C不会检查数组边界,因此只要您有权访问最后一项,它就会顺便运行。
但是,如果您更频繁地运行此代码,则可能会遇到其他错误。由于您正在更改不属于该阵列的内存,因此您可能会获得各种(非)预期行为。是的,Qix,包括访问冲突:)
由于示例数组中的值非常低,因此额外int中的值较高的可能性很高。如果是这样,它将保留在数组的末尾,并且它永远不会被覆盖。从这段代码中得到任何错误可能需要很长时间,但最终你可能会这样做。
所以,有时它会起作用,有时则不行。这也与您的应用程序的其余部分以及那里的数据类型有关。可能是你从来没有(或几乎从不)得到错误,然后你做了一个改变并重新编译,然后突然你会得到它。此外,您可能会意外更改内存(交换最后一项),这会给您一个不正确的数组(一个项目被另一个项目替换),这可能会导致奇怪的情况,因为您还更改了其他变量中的值。
因此,长话短说,很难预测究竟会发生什么。
答案 1 :(得分:1)
您可能正在获取已排序的值。但是,没有人可以确保您将获得始终排序的值或一组值作为初始化数组。
访问C中的超出内存是不确定的行为。即使在您的情况下,当您访问保留内存的下一个位置并使用它来交换索引SIZE
和SIZE+1
的值时。因此,如果你仔细检查输出,你可能会得到排序的数组(幸运的是),但你必须看到在初始化数组中可能没有的一个元素。