C/C++ 数组相关要点总结
在 C/C++ 中使用数组时,需要注意一些关键的事项,以确保程序的正确性和安全性:
- 数组越界:
- 访问数组时,索引必须在有效范围内。C/C++ 不会对数组索引进行边界检查,越界访问可能会导致未定义行为,如访问非法内存、修改敏感数据或导致程序崩溃。
- 数组初始化:
- 局部数组(自动存储期的数组)如果不显式初始化,其内容是不确定的。全局或静态数组如果未初始化,会自动初始化为 0。
- 初始化列表中的元素数量不能超过数组声明时的大小。
- 数组大小:
- 数组的大小必须在编译时已知,且大小必须是正整数常量或常量表达式。
- C99 标准引入了变长数组(VLA),其长度可以在运行时确定,但 C++ 标准并不支持 VLA。
- 数组作为函数参数:
- 当数组作为函数参数时,实际上传递的是指向数组首元素的指针。因此,函数内部无法获取数组的实际大小。
- 为了在函数内部处理数组,通常需要额外传递一个表示数组大小的参数。
- 指针与数组:
- 指针和数组在很多方面可以互换使用,但它们是不同的概念。指针是一个变量,可以指向任何类型的数据;数组是一个固定大小的连续内存块,用于存储相同类型的数据。
- 指针算术与数组索引密切相关,但指针可以更灵活地进行操作,如动态分配和释放内存。
- 多维数组:
- 多维数组可以看作是数组的数组。例如,二维数组可以看作是一个包含多个一维数组的数组。
- 访问多维数组时,需要正确使用多个索引,并且每个维度的索引都必须在有效范围内。
- 内存管理:
- 对于动态分配的数组(如使用
malloc、calloc或new分配的数组),必须负责在适当的时候释放内存(使用free或delete),以避免内存泄漏。
- 对于动态分配的数组(如使用
- 数组与指针的转换:
- 在某些情况下,数组名可以被当作指向其首元素的指针。但是,这种转换并不总是安全的或直观的,特别是在涉及数组大小或多维数组时。
- 数组复制与赋值:
- 数组不能直接使用赋值操作符进行复制。要复制数组,必须逐个元素地复制或使用标准库函数如
memcpy。
- 数组不能直接使用赋值操作符进行复制。要复制数组,必须逐个元素地复制或使用标准库函数如
- 数组与标准库容器:
- 在 C++ 中,通常建议使用标准库容器(如
std::vector)而不是原生数组,因为容器提供了更多的安全性和便利性。
- 在 C++ 中,通常建议使用标准库容器(如
遵循这些注意事项可以帮助你更安全、更有效地使用 C/C++ 中的数组。
更进一步地,可参见如下详细介绍:
- 避免使用变长数组
- 局部数组不应过大
- 禁用柔性数组
- 不应将数组作为函数的形式参数
- sizeof 不应作用于数组参数
- 避免转换指向数组的指针
- 未指向同一数组的指针不可相减
- 未指向同一数组或同一对象的指针不可比较大小
- 未指向数组元素的指针不应与整数加减

浙公网安备 33010602011771号