我院新闻
【关于[C]报错:Run-Time Check Failure #2 - Stack around the variable ‘xxx‘ was corrupted的示例及解决办法】
发布时间:2024-01-12

问题场景:

  在我们编写c语言程序时,尤其是使用数组进行编写时,通常会遇到一种令我们猝不及防的报错:Run-Time Check Failure #2 - Stack around the variable ‘xxx‘ was corrupted,如图:

 


问题描述

  相信很多小伙伴遇到这个问题时都会和当时的我一样懵,奇葩的是这个程序明明可以成功运行且结果无误,但为什么在出结果的同时会弹出报错窗口呢?不要着急,我在这里可以为大家献上我的锦薄之力,以下是我个人遇到的此类报错出现的原因、代码场景以及解决办法:

1.此类报错出现的原因通常是数组内存越界

内存越界我遇到过两种情景:

(1)声明数组时没有规定数组元素个数的大小:

  这里由于某些原因未能给大家呈现完整的代码,但大家只需要知道图中rev_intary函数的功能是将数组的所有元素倒序排列,而函数intary_rcpy是将一个数组的所有值赋给另一个数组对应的元素,

在main函数中,我设了这样两个数组导致出现报错:int m[]={5,6,8,9};int n[];

很明显我这两个数组都没有标明数组大小,但实际上问题是出在第二个数组上,因为数组m在初始化为{5,6,8,9}时,程序会根据我初始化的个数来自动确定数组m的大小为4,我在main函数中应用了函数intary_rcpy(m,n,4);这会使数组m的各个元素值储存到数组n当中,但由于数组n的大小我没有给出声明,导致栈溢出。

正确的做法只要给数组规定一个大小就行了:int [4];当我这样设出n时,就不再出现报错了。

针对这类情景,总结如下

以下讲解来自chatgpt:

当你声明一个数组时,如果没有指定数组的大小,编译器无法知道需要为数组分配多少内存空间。如果你在声明数组后使用它,并且在使用过程中写入超出数组分配的空间范围的数据,就会导致栈溢出。

在C/C++中,数组是在栈上分配的,它们的大小在编译时确定。如果你声明一个没有指定大小的数组,编译器无法为其分配足够的内存空间。因此,当你尝试向未分配足够空间的数组中写入数据时,就会发生栈溢出错误。

要解决这个问题,你需要在声明数组时指定合适的大小,以确保分配足够的内存空间来存储你要使用的数据。例如,可以声明一个足够大的数组来存储密码,并确保不要超出数组范围进行读写操作。另外,还可以考虑使用动态内存分配函数(如malloc()或new)来在堆上分配内存。这样,你可以根据需要动态调整内存大小,从而避免栈溢出问题。
————————————————
版权声明:本文为CSDN博主「王三召」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_52918245/article/details/132117781

(2)数组下标越界:

下面是一段此类错误的代码

  乍一看没有问题,实际上,我们仔细观察,在for循环这里出现了问题,我们在声明数组arr时明确了元素个数为5,因此arr的元素下标应该是从0-4,但在for循环中,我们居然让i增加到了5,也就是说,我在最后访问了arr[5],这就导致我越界了,因为arr数组只开辟了5个整型数据元素的空间,即arr数组的可访问元素下标范围在0-4之间for循环的最后一次循环明显越界访问了下标为5的元素(即第6个元素).

因此会导致编译器报错"Run-Time Check Failure #2 - Stack around the variable 'arr2' was corrupted."

2.编译器本身问题

刚才说过,此类报错的原因通常是内存越界,但也有例外,我最近就碰到了这个例外。

这里我所设的函数都是关于动态二维数组的,main函数里我的二维数组也都明确了数组大小,我左看右看也没看出哪里出现了越界,于是我就到网上搜寻网友们的方案,找到了两种可行的解决方法:

 1).把“project->配置属性->c/c++->代码生成->基本运行时检查 设置为默认值。                               2).创建数组的方式改用new或者malloc,改为正常运行

3.总结:

发生此报错一般有两种情况:

        第一 -> 数组下标越界。这也是最常见的问题原因,解决办法是检查数组是否有越界情况,如果有的话创建一个更大的数组

        第二->声明时未规定数组大小。

       第三->编译器本身的问题。(在前两种情况不适用时考虑编译器问题。)

[返回上级]