此代码:
#include <stdio.h>
#define SIZE 10
int main(){
int a[SIZE]={2,6,4,8,10,12,89,68,45,37};
int pass;
int i;
int hold;
int dim=10;
printf("Data items in original order\n");
for(i=0; i<SIZE; i++){
printf("%4d", a[i]);
}
for(pass=1; pass<SIZE; pass++){
for(i=0; i<dim; i++){
if(a[i]>a[i+1]){
hold=a[i];
a[i]=a[i+1];;
a[i+1]=hold;
}
}
dim--;
}
printf("\nData items in ascending order\n");
for(i=0; i<SIZE; i++){
printf("%4d", a[i]);
}
printf("\n");
return 0;
}
给我这个错误:
Data items in original order
2 6 4 8 10 12 89 68 45 37
Data items in ascending order
2 4 6 8 10-98850560 12 37 45 68
*** stack smashing detected ***: ./prog terminated
为什么?我不明白请给我解释一下。非常感谢你。我就是不明白。我不明白请帮我。我不知道该怎么办。拜托。
答案 0 :(得分:3)
问题在于此行:
if(a[i]>a[i+1])
i
可以升至dim-1
且dim
为10。因此,当i
变为9时,上述表达式变为
if(a[9]>a[10])
您将访问仅包含10个元素的数组的第11个元素,因此您将访问越界内存地址。这是不确定的行为。
来自wiki:
某些编程语言(最著名的是C和C ++)的行为在某些情况下是不确定的。在这些语言的标准中,某些操作的语义被描述为未定义。这些情况通常代表代码中明确的错误,例如,在数组边界之外建立索引。
答案 1 :(得分:0)
stack smashing detected
表示堆栈中有缓冲区溢出,您基本上超出了数组的范围。
int dim=10;
的暗度是10
for(pass=1; pass<SIZE; pass++){ <<< First loop, dim is still 10
for(i=0; i<dim; i++){ <<< i < 10
if(a[i]>a[i+1]){ <<< Last loop : i=9
hold=a[i];
a[i]=a[i+1];;
a[i+1]=hold;
}
}
dim--;
}
i = 9 a [i + 1] => a [10]超出范围
希望有帮助~~
答案 2 :(得分:0)
在语句:if(a[i]>a[i+1])
中,当i = 9(此for循环中最多9)时,您正在比较a[9]>a[10]
,但定义的数组最多为a[9]
。
将for循环修改为:
for(i=0; i<dim-1; i++)
if(a[i]>a[i+1])