![](https://s5-media.51cto.com/ost/pc/static/noavatar.gif)
C++ 数组可以为变量吗
关于C++数组提出几点问题:
预备
先看下这两段代码
1.变量作为数组的长度可行吗?
输出:
2.访问超过长度的数组下标的值会发生什么?
输出:
分析
首先分析问题1,我们平时看书学习过程中总看见说C++的数组长度一定要是常量且不能是变量,很多资料需要在编译期确定栈帧的大小,如果是变量就不能在编译器确定栈帧大小,但上述代码为什么可以正常运行呢?光看不如实践,先看这样一段代码:
输出:
再看这段代码:
输出:
func4a - func3a = 88
func3a - func2a = 488
从上面两段代码其实可以看出C++是支持变量长度的数组的,说不支持的那是很古老的编译器.
备注:尽管C++目前支持变量长度的数组,但是不建议使用,因为数组使用的是栈内存,栈内存是有大小限制的,一般是8192字节,既然长度是变量,那就可能是任何值,就有可能超过8192,这样就会stack overflow,所以动态内存最好使用堆内存。
再分析问题2:操作超过数组长度的内存会发生什么?看下面这段代码:
输出:
看代码输出,在函数内操作超过数组长度的内存没有什么影响,但是它却导致了上一级的数组a[200]里的内容被改变,因为数组使用的是栈内存,经过问题1的代码输出以及分析可以看出,栈帧内存是向下增长的,代码中操作了超过数组长度的内存地址,就影响到了之前栈帧的内存数据,导致之前栈内存数据出现错误,可能就会引发大bug。
总结
C++中数组长度可以是变量,但是不建议使用,因为数组使用的是栈内存,变量可以是个比较大的数,这样会导致stack overflow,建议使用堆内存。
操作超过数组长度的内存可以编译通过且表面上看不出来问题,但是会导致栈内存出现脏写,最终可能会引发难以排查的bug,建议数组使用std::array,操作超过长度的下标会抛异常有利于开发者及时发现错误。
![](https://s5-media.51cto.com/ost/pc/static/noavatar.gif)