数组有何不好之处

从时间和空间的角度来讲,数组是访问内存中连续对象的最佳结构。然而,它同时也是非常底层的数据结构,不当地使用它常常会导致大量潜在的错误。而且,基本上在所有需要用到数组的地方,我们都有更好的替代品。我所说的“更好”是指更易于读写、不易导致错误,以及同等效率。

和数组如影随形的两个基本问题是:

数组不知道其自身的长度
稍有风吹草动,数组的名字就会转换成指向其首元素的指针
思考以下一些例子:

第二个函数调用会玷污不属于 arr2 的内存。通常,程序员都不会传递错误的长度给函数 f,但传递参数是个额外的负担,而且不时都会有些人犯错(传递了错误的长度)。我更喜欢使用标准库里的 vector,这样写出来的程序更加简单明了:

因为数组不知道其自身的长度,所以不能直接进行数组赋值:

vector 的另一个好处是,memcpy() 不能正确处理带有复制构造函数的元素,例如 string:

数组的大小在编译时就已固定:

C99 允许可变长的局部数组,但 VLA(变长数组,variable-length array)也有其独特的问题。

在 C 和 C++ 中,数组名“退化”为指针的方式是基本常识。然而,数组退化和继承“互动”时,是非常不妙的。例如:

在后一个函数调用里,Derived[] 被认为是 Base[],以至于当 sizeof(Derived)!=sizeof(Base) 时,余下的代码不再能正常工作。如果我们使用 vector 的话,在编译时就能捕捉到这个错误:

大量 C 和 C++ 初学者的程序错误都和使用数组有关。