free website counter

C++中变量做数组维数

  记得C/C++语法规范中,不能使用变量定义数组维数,因为数组维数的确定,需要在编译阶段完成。要想在程序实行阶段确定数组维数,应该使用new/malloc去动态分配;但是试验了一下,由于g++对C99的支持,使得使用变量定义数组维数也是可行的(在Linux系统下),但是如此方法,在VC下会报错,即这并不是符合C++语法规范的写法,在很大程度上会限制代码的平台兼容性,应该避免这种写法,以此备忘。

C++语法中关于变长数组的规范

  无论使用变量,还是函数表达式定义数组的长度,都是非法的只能使用常量表达式进行定义,即以下写法都是非法的。但是当对buf_size的定义加上const修饰符,则是合法的定义。

unsigned buf_size = 1024;
int ia[buf_size];
int ia[get_size()];

  但是可以通过指针来动态申请空间实现动数组长度的变量赋值,在栈中分配的内存,大小都是编译时就确定好的,如果想在运行时来动态计算使用内存的大小的话,就要用new这样的动态分配函数,来达到更高的灵活性。c++ 用new分配空间以后,不用的时候要记得delete释放内存,不然会有内存泄露问题。

int length = 10;
int * varArray;
varArray = new int[length];

C99规范对变长数组的支持

  C99规范中增加了对变长数组的支持,即可以使用C++语法规范中非法的方法来定义变长的数组,如此,对于支持C99规范不太好的平台来说,比如VC,就有可能出现很多的问题,应该尽量使用变量定义数组长度的C99规范支持的写法,在C99规范中,使用cin输入的整数作为数组长度,也是可行的。看样子C99规范中是使用动态数组的方式,支持了变长数组的定义,如下写法,也并不会出现数组越界访问的错误。

int n = 10;
int a[n];
a[100] = 9;

一个比较奇葩的现象

  证明了C++中,使用变量定义数组长度时,是使用动态数组实现,因此不存在数组访问越界的问题;而使用常量定义数组时,会出现数组访问越界。下面的代码,会产生数组越界的报错。

const int n = 10;
int a[n];
a[100] = 9;
Published 23 March 2015
分享按钮