为什么C编译器说检测到***堆栈损坏***:终止

  • 本文关键字:堆栈 损坏 终止 编译器 c
  • 更新时间 :
  • 英文 :


我的代码有什么问题,它显示'检测到堆栈粉碎';问题陈述: 给定一个数组,我们必须找到数组中最小的元素。

#include<stdio.h>
int main(){
int arr[20],i,j,c,x,num;
scanf("%d",&num);
for(x=0;x<num;x++){
scanf("%d",&arr[x]);
}
for(i=0;i<sizeof(arr)-1;i++){
if(arr[i]>arr[i+1]){
c=arr[i];
arr[i]=arr[i+1];
arr[i+1]=c;
}
}
printf("%d",*(arr+0));
return 0;
}

如果用户提供的值num大于20,您的代码将把数组arr的末尾写入内存。这是未定义的行为,可能会导致崩溃。

两个问题:

(1)int arr[20]只能保存20个值,但你可以让用户输入任何数字。

(2)sizeof(arr)给出的是以字节为单位的大小,而不是元素的数量。

编译器能够检测到这些问题中的一个或两个,并给你一个错误消息告诉你。

最新更新