C++避坑指南-数组越界
问题场景
在访问数组时没有判断数组size, 导致访问的索引号超过了数组size产生访问越界,程序出现异常行为
示例代码
实际情况比较多, 我们来展开说明下
原生数组访问越界
#include <iostream>
using namespace std;
void ArrayOut()
{
int a[] = {23,33,1,32,5,9,10};
for(int i = 0; i <= 10; i++)
{
cout << a[i] << endl;
}
}
int main(int argc, char* argv[])
{
ArrayOut();
return 0;
}
运行结果
注意程序并没有coredump, 而是读到了脏数据,如果是实际应用,这些脏数据将产生不可预测的行为,很可能转嫁为其他的异常或coredump,这种情况将更难排查
vector索引访问越界
void VectorOutOfIndex()
{
vector<int> a({23,33,1,32,5,9,10});
for(int i = 0; i <= 10; i++)
{
cout << a[i] << endl;
}
}
结果和原生数组一致,访问到了脏数据但并没有coredump
vector首末元素访问越界
void EmptyVectorOut()
{
vector<int> emptyVector;
cout << emptyVector.front() << endl;
}
int main(int argc, char* argv[])
{
EmptyVectorOut();
return 0;
}
运行结果为程序coredump
原因:
front()函数内部会检查容器是否为空, 如果为空会抛出异常导致core dump
解决方法
1.原生数组的访问, 需要在初始化时记住size,并在遍历等访问时判断避免越界
2.容器类遍历时可以使用迭代器或如下写法
void VectorLoop()
{
vector<int> a({23,33,1,32,5,9,10});
for(int element : a)
{
cout << element << endl;
}
}
3.访问容器类首末元素 front(), back(), 一定要加上empty()判断
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)