C/C++ 数组相关要点总结

在 C/C++ 中使用数组时,需要注意一些关键的事项,以确保程序的正确性和安全性:

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

遵循这些注意事项可以帮助你更安全、更有效地使用 C/C++ 中的数组。

更进一步地,可参见如下详细介绍:

  1. 避免使用变长数组
  2. 局部数组不应过大
  3. 禁用柔性数组
  4. 不应将数组作为函数的形式参数
  5. sizeof 不应作用于数组参数
  6. 避免转换指向数组的指针
  7. 未指向同一数组的指针不可相减
  8. 未指向同一数组或同一对象的指针不可比较大小
  9. 未指向数组元素的指针不应与整数加减

 

posted @ 2024-06-25 09:18  幸运泡泡  阅读(156)  评论(0)    收藏  举报