为什么C编译器会显示“*** stack smashing detected ***:终止”?

8 浏览
0 Comments

为什么C编译器会显示“*** stack smashing detected ***:终止”?

我的代码有什么问题,为什么会显示"检测到堆栈溢出"?

问题陈述:

给定一个数组,我们需要找到数组中最小的元素。

#include
int main(){
    int arr[20],i,j,c,x,num;
    scanf("%d",&num);
    for(x=0;xarr[i+1]){
            c=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=c;
        }
    }
    printf("%d",*(arr+0));
    return 0;
}

0
0 Comments

编译器报错 "*** stack smashing detected ***: terminated" 的原因是由于以下两个问题:

(1) 数组 int arr[20] 只能容纳二十个元素,但你允许用户输入任意数量的元素。

(2) sizeof(arr) 返回的是数组的字节大小,而不是元素的个数。

编译器能够检测出这两个问题,并给出相应的错误提示信息。

我对第一个问题有所了解,但第二点解答了我的疑惑。谢谢...

0
0 Comments

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

解决方法:

1. 检查用户输入的值,确保不超过数组的长度。可以使用条件语句或循环来限制用户输入的值的范围。

2. 增加数组的长度,以容纳更大的输入值。这样可以避免写入超出数组末尾的内存。

3. 使用动态内存分配来创建一个具有足够空间的数组,以容纳用户输入的值。这样可以避免写入超出分配内存的部分。

以下是一个示例代码,展示了如何解决这个问题:

#include 
#include 
#define MAX_SIZE 20
int main() {
    int num;
    int *arr;
    printf("Enter a number: ");
    scanf("%d", &num);
    if (num > MAX_SIZE) {
        printf("Number is too large. Please enter a number less than or equal to %d.\n", MAX_SIZE);
        return 0;
    }
    arr = (int*) malloc(num * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed.\n");
        return 0;
    }
    // Do something with the array
    free(arr);
    return 0;
}

在上面的示例代码中,我们使用了动态内存分配来创建一个具有足够空间的数组,以容纳用户输入的值。通过检查用户输入的值,我们确保它不会超过数组的最大长度。如果用户输入的值超过了最大长度,程序会打印一条错误消息,并终止运行。如果动态内存分配失败,程序也会打印一条错误消息,并终止运行。

通过以上的解决方法,我们可以避免stack smashing detected错误的出现,并确保程序的稳定性和安全性。

0