如何解决C++中的此运行时错误?- “变量周围的堆栈已损坏”

How can I solve this run time error in C++? - "Stack around variable was corrupted"

提问人:강희주 提问时间:4/19/2022 更新时间:4/19/2022 访问量:134

问:

我尝试获得 、 、 的最小值,并通过实现获得与函数重载类似的处理结果的函数。two integersreal numbersstringsinteger arrays

所以我写这样的代码

#include <iostream>  
#include <cstring>    
using namespace std;  

int GetMin(int a, int b);
double GetMin(double a, double b);
char* GetMin(char* a, char* b);
int GetMin(int* arr, int size);


int main()
{
  int num1, num2;
  double num3, num4;
  char s1[30], s2[30];
  int arr[10];

  cout << "Enter two integers : ";
  cin >> num1 >> num2;
  cout << "The minimum value is " << GetMin(num1, num2) <<"\n";

  cout << "Enter two real numbers : ";
  cin >> num3 >> num4;
  cout << "The minimum value is " << GetMin(num3, num4) <<"\n";

  cout << "Enter two strings : ";
  cin >> s1 >> s2;
  cout << "The minimum value is " << GetMin(s1,s2) <<"\n";

  cout << "Elements of an Array : ";
  cin >> arr[10];
  cout << "The minimum value is " << GetMin(arr[10], 10);


}


int GetMin(int a, int b)
{
  if (a > b) return b;
  else return a;


}


double GetMin(double a, double b)
{
  if (a > b) return b;
  else return a;

}


  char* GetMin(char* a, char* b)
{
    if (strcmp(a, b) < 0) return a; 

}


  int GetMin(int* arr, int size)
{
    int min = arr[0];
    for (int i = 1; i<size; i++)
        if (arr[i] < min)
            min = arr[i];
    return min;

}

这是所需的结果。

Enter two integers : 10 20 
The minimum value is 10
Enter two real numbers : 56.84 120.26
The minimum value is 56.84
Enter two strings : orange apple
The minimum value is apple
Elements of an Array : 41 67 34 25 0 54 98 21 58 62
The minimum value is 0

我收到了此错误消息。

Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.
C++ visual-Studio std iostream c 字符串

评论


答:

2赞 Yunnosch 4/19/2022 #1

您有未定义的行为,这是由于尝试读入数组之外的索引所导致的:

cin >> arr[10];

我认为您正在尝试读取整个数组,但这是不可能的。如果是(例如,通过重载),它将使用而不是 .>>arrarr[10]

你可以通过重载来解决这个问题(尽管我怀疑这太复杂了......或者通过循环读入。>>

0赞 Some programmer dude 4/19/2022 #2

你不能输入到像这样的数组中

cin >> arr[10];

相反,它会将单个值输入到十个元素数组的第 11 个元素中(导致未定义的行为)。

您需要使用循环来逐个输入每个元素:

for (unsigned i = 0; i < std::size(arr); ++i)
{
    std::cout << "Enter input for element " << i + 1 << ": ";
    std::cin >> arr[i];
}

在不相关的说明中,我建议您了解有关标准容器的更多信息,例如 和 。它们将使您作为 C++ 程序员的生活变得更加简单。std::arraystd::string

3赞 Yujian Yao - MSFT 4/19/2022 #3

用于为整个数组赋值是错误的。更常见的方法是使用 or 结构。我建议您阅读本期以了解输入和输出。cinforwhile

另外,您是否在程序中观察到警告?

enter image description here

警告 C6201 索引“10”超出了有效索引范围“0”到“9” 可能堆栈分配的缓冲区“arr”。

数组 arr[10] 的索引应该是 arr[0]~arr[9]。关于 C6385,您应该阅读本文档

char* GetMin(char* a, char* b)
{
    if (strcmp(a, b) < 0) return a;

}

最好不要使用函数的参数作为返回值。常用的方法是定义一个变量来存储要返回的参数。