您好我在C中实施bubblesort并遇到了一些我无法理解的问题。
#include <stdio.h>
#include <time.h>
void main(){
int i;
int j;
int vahe;
int sisse;
int lst[50];
printf("Enter how many elements you want to sort:");
scanf("%d",&sisse);
srand(time(NULL));
for(i=0;i<sisse;i++){
lst[i]=rand() % 1000;
}
for(i=sisse-2;i>=0;i--){
for(j=0;j<=i;j++){
if(lst[j]>lst[j+1]){
vahe=lst[j];
lst[j]=lst[j+1];
lst[j+1]=vahe;
}
}
}
printf("Result: ");
for(i=0;i<sisse;i++){
printf("%d ",lst[i]);
}
}
在这段代码中,我可以提供超过50个elemnts进行排序,它适用于53个元素。如果我给54最后一个没有排序。为什么我能够做到这一点以及如何修复它以便我只能提供与数组大小相同的元素?
答案 0 :(得分:1)
这是因为数组的工作方式类似于指针。实际上,数组变量只不过是指向内存中某个位置的地址(第一个要特定的元素)。现在,如果您执行以下操作:array[5]
,您实际上是在说:取array
指向的地址并向其添加5。在运行时,这将被执行;处理器不知道该阵列应该仅包含(假设)4个元素。这对编译器来说非常重要,但之后,您必须注意不要以编程方式超出边界。
为什么程序仍然可以使用?因为编译器期望您只在数组中存储4个元素,并且您将执行任何操作以确保不会存储更多元素。因此,编译器可能会使用第4个元素下面的内存并将其保留为另一个变量。当您现在超出数组的边界时,您将覆盖所述变量的值。
答案 1 :(得分:0)
如果您访问数组越界,则您已处于未定义的行为区域。你不能在那时推断它的行为。