C语言数组,不定长数组及C++中的<vector>容器
·
一、C 语言普通静态数组
定义语法:
int arr1[10];
int arr2[] = {1,2,3}; //自动推导长度为3
普通静态数组特性:
- 数组大小必须是常量 (C89标准强制)
- 一旦定义,长度固定,不能扩容、不能缩小
- 内存:栈内存(局部数组),分配在栈上
- 数组名本质是首元素地址,不能直接赋值
- 缺点:无法运行时灵活改变容量,栈空间有限,大数组容易栈溢出
// C89 错误写法
int n;
scanf("%d", &n);
int a[n]; // C89不支持!
二、C99:VLA 变长数组(Variable Length Array,俗称不定长数组)
定义语法:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int arr[n]; // VLA:运行时n确定数组长度
for(int i = 0; i < n; i++)
arr[i] = i;
return 0;
}
不定长数组特性:
- 仅 C99 标准支持,MSVC(微软编译器)不支持 VLA;GCC 支持
- 长度只能初始化时确定,不能中途扩容
- 依然在栈上分配内存!如果 n 很大,直接栈溢出崩溃
int n=5;
int a[n];
n=10;
// a数组大小依旧是5,不会变化!无法动态扩容
-
不能初始化列表赋值:

-
作用域结束自动销毁,不需要手动 free
误区:VLA ≠ 动态数组!它只是运行时确定尺寸的定长数组,不可扩容
三、C++ std::vector
定义语法:
#include <vector>
using namespace std;
int main()
{
vector<int> vec; // 空动态数组
vector<int> vec2(10); // 初始10个元素
vec.push_back(1); // 自动尾部扩容
vec.resize(20);
return 0;
}
vector 特性:
- 支持自动扩容,不需要程序员手动管理内存
- 自带接口:push_back、pop_back、size()、capacity()
- 底层内存在堆上,封装了 malloc/realloc/free
- 对象生命周期结束自动释放内存
- 不是数组!是封装好的类,内部持有一块连续堆内存
四、三者横向对比
| 对比维度 | C静态数组 | C不定长数组VLA | C++ vector |
|---|---|---|---|
| 内存位置 | 栈上 | 栈上 | 堆上 |
| 长度限制 | 编译期固定 | 运行时确定、不可扩容 | 运行时自动扩容 |
| 内存释放 | 栈自动回收 | 栈自动回收 | 对象销毁自动释放堆内存 |
五、总结
- C 静态数组 int a[5]
大小必须是编译常量,支持大括号初始化;存放栈中,长度固定,不能扩容,C89/C99 通用。
- C99 VLA 变长数组 int a[n]
运行时确定数组长度,GCC 支持、VS 不支持;存储在栈,定义后尺寸永久不变,禁止int
a[n]={…}初始化;不是真正动态数组,大数据容易栈溢出,工程不推荐。
- C++ vector
C++ 独有,底层堆内存;可以自动扩容,提供丰富成员函数;生命周期结束自动释放内存,是标准的动态数组容器,C 语言没有 vector。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)