C11 的变长数组
C11 的变长数组
C 语言新版本支持变长的数组(variable length array,简称VLA),数组的长度可以用一个变量来决定。
如果 C 编译器不支持变长数组,那么宏定义 __STDC_NO_VLA__ 就必须定义为 1。使用下面的代码可以检查是否支持变长数组:
1 |
|
代码中有些地方是不能声明和定义为变长数组的:
一、变长数组不能是全局变量
二、extern 外部变量
三、结构或者联合里面的字段
四、static 变量
也就是说,变长数组只能用于非 static 的局部变量。
变长数组的实现原理是什么,下面以一个简单的 .c 程序,进行编译成汇编看看:
1 | // varr.c |
用下面命令:
1 | gcc -std=c99 -S varr.c |
编译为汇编得到:
1 | "varr.c" |
从上述汇编代码中可以看出,可变数组是根据数组大小的变量,动态地在栈中开辟一串连续的空间,来作为动态数组的存储空间。
函数执行完毕之后,这部分在栈内动态开辟的空间,会自动被回收。