前言
在算法练习与 C++ 竞赛编写代码时,很多新手习惯直接使用 vector 容器,但静态数组凭借访问速度更快、内存开销更低的优势,在竞赛场景里依然高频使用。本文记录静态数组常见误区与基础使用规范。
一、静态数组基础定义方式
固定大小的静态数组,常见两种定义位置,效果差异很大:
#include<iostream>usingnamespacestd;// 全局数组:开辟在堆内存,空间很大,可以定义百万级大小intarr[1000005];intmain(){// 局部数组:开辟在栈内存!空间很小,一般上限仅几MB// int a[1000000]; // 直接写在这里会栈溢出,程序直接崩溃arr[0]=100;cout<<arr[0]<<endl;return0;}核心知识点:
写在函数外面(全局区)的数组,内存充足;
main 函数内部局部数组不能开太大,极易栈溢出运行报错。
二、数组下标越界经典问题
数组下标从 0 开始,很多初学者容易出现越界访问。
#include<iostream>usingnamespacestd;// 全局数组:开辟在堆内存,空间很大,可以定义百万级大小intarr[1000005];intmain(){// 局部数组:开辟在栈内存!空间很小,一般上限仅几MB// int a[1000000]; // 直接写在这里会栈溢出,程序直接崩溃arr[0]=100;cout<<arr[0]<<endl;return0;}越界属于隐形错误,不会编译失败,但会造成答案错乱、程序随机闪退,调试很难发现。
三、静态数组初始化小技巧
如果想要数组全部初始化为 0:
全局数组默认全部自动置 0,无需手动初始化;
局部数组可以使用 int a[100] = {0}; 快速全部清零。
四、适用场景总结
✅适合:算法竞赛、固定数据规模、追求运行速度的程序
❌不适合:元素数量不确定、需要动态扩容的场景,这种场景优先选择 vector
结尾总结
静态数组看似简单,但栈溢出、下标越界两类问题是新手最高频踩坑点。写代码时区分全局与局部数组,严格控制下标范围,就能规避绝大多数错误。down编辑器