成功解决“Run-Time Check Failure #2 - Stack around the variable ‘arr‘ was corrupted.“问题

简介: 成功解决“Run-Time Check Failure #2 - Stack around the variable ‘arr‘ was corrupted.“问题

问题描述

我们在使用C语言编写程序,特别是使用数组进行相关操作时经常会遇到编译器报错“Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.”,如图:

可以看到编译器抛出了异常及其提示信息:

Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.

翻译一下就是:

运行时检查失败#2-变量“arr”周围的堆栈已损坏。

造成这个错误的原因是:

内存越界

那么遇到这种情况我们该如何解决呢?


原因分析

首先以下面一段简短的代码为例向大家解释问题到底出在哪里

#include<stdio.h>
 
int main()
{
  int arr[5] = { 0 };
  int i = 0;
  for (i = 0; i <= 5; i++)
  {
    arr[i] = i;
    printf("%d ", arr[i]);
  }
 
  return 0;
}

如图,这是一段使用for循环的方式给数组元素赋值的程序代码。看似没有什么问题,但如果你原封不动的将该段代码放在编译器运行时却会导致编译器报错,如图:

然而问题就出在第7行代码:

for (i = 0; i <= 5; i++)

注意,在程序中,arr数组只开辟了5个整型数据元素的空间,即arr数组的可访问元素下标范围在0-4之间,但在代码的第七行,for循环的最后一次循环明显越界访问了下标为5的元素(即第6个元素).

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


解决方法

在搞清楚了编译器为何会报错之后,我们的解决方法也非常简单,即,将原代码改为

for (i = 0; i <= 4; i++)

这样就确保了在访问数组元素时不会造成越界访问,就可以防止编译器报错

如果您遇到的报错场景比这段函数复杂许多,不要担心,下面会提供给你一些解决思路:

造成这个错误的原因是:

内存越界

解决方向

通常是数组下标访问越界,或是指针访问数组时造成访问越界

注意检查的点:(以二维数组为例)

假设数组初始化时:  arr[m][n]

则数组使用下标访问元素时,可访问的范围是:

arr[0][0]开始,到arr[m-1][n-1]结束

若使用指针访问数组元素,则可访问的范围是:

*arr开始,到*(* (arr + m-1) + n-1)为止


需要注意的是, 很多朋友在使用memcpy()函数或memset()函数时也会导致程序报这个错误,以memcpy为例,主要原因是memcpy()函数拷贝的字节数大于目的地的空间大小了,这样同样会造成内存越界访问,如:

因此需要检查一下传入函数的字节数是否超出了目的地数组的大小.


结语

希望上面提供的线索可以帮助到大家在代码中查找出现了什么问题.学海漫浩浩,我亦苦作舟!欢迎大佬评论或私信我,一起学习,一起进步.Bug Free!



相关文章
|
存储 区块链 CDN
推荐几个免费好用的图床
图床一直以来都是很多人的刚性需求,无论是站长,还是平时逛论坛、写博客的用户,再或者是做外贸生意都可能需要用到图床。好用的图床提供了长期稳定存储且高访问能力的图片托管能力,这也是大家选择图床的核心因素。所以在这里我推荐几款免费且超好用的图床。
1560 0
|
存储 算法 数据挖掘
C语言中如何快速找出数组最大值下标
C语言中如何快速找出数组最大值下标
|
Unix 编译器 C++
Cmake环境搭建
Cmake环境搭建
249 0
|
5月前
|
存储 负载均衡 安全
NAKIVO Backup & Replication 11.1 发布 - 快速高效能的备份解决方案
NAKIVO Backup & Replication 11.1 发布 - 快速高效能的备份解决方案
169 0
|
编译器 C++
使用Visual Studio 2022 创建lib和dll并使用
本文介绍了如何在Visual Studio 2022中创建静态库(lib)和动态库(dll),并展示了如何使用这些库。文章详细说明了创建新项目、编写代码、生成库文件、配置项目属性以及编写测试代码的步骤,并提供了相应的截图和代码示例。作者还分享了在创建和使用库的过程中遇到的一些问题及其解决方案。
4509 0
使用Visual Studio 2022 创建lib和dll并使用
|
算法
基于GA遗传优化的PID控制器最优控制参数整定matlab仿真
通过遗传算法优化PID控制器的参数,可以有效提高控制系统的性能。本文详细介绍了GA优化PID参数的原理、适应度函数的设计以及MATLAB实现步骤,并通过仿真验证了优化效果。希望本文能为读者在实际应用中提供参考和帮助。
777 18
|
Linux Windows
Nomachine 最简安装与使用指南
这是一篇2022年Nomachine软件的极简安装与使用指南,包括Windows和Linux系统下的安装步骤,以及如何在Windows系统上通过Nomachine远程控制Linux系统的方法。
Nomachine 最简安装与使用指南
|
Linux 开发工具 异构计算
【ZYNQ】QSPI Flash 固化程序全攻略
【ZYNQ】QSPI Flash 固化程序全攻略
4452 0
|
关系型数据库 MySQL Java
MySQL 巨坑:update 更新慎用影响行数做判断!!!
MySQL 巨坑:update 更新慎用影响行数做判断!!!
2360 0
MySQL 巨坑:update 更新慎用影响行数做判断!!!
|
NoSQL 关系型数据库 MySQL
软件测试之【基于开源商城系统fecmall功能测试项目实例】
软件测试之【基于开源商城系统fecmall功能测试项目实例】
1339 0
软件测试之【基于开源商城系统fecmall功能测试项目实例】

热门文章

最新文章