为什么当我尝试编译包含以下两行的代码时,gcc或clang都不会生成错误?gcc错误生成
int palindrome(char s[]){
char s2[strlen(s)];
我想在这样的情况下,你将不得不动态地分配内存到S2。
为什么当我尝试编译包含以下两行的代码时,gcc或clang都不会生成错误?gcc错误生成
int palindrome(char s[]){
char s2[strlen(s)];
我想在这样的情况下,你将不得不动态地分配内存到S2。
GCC对此行为有一个扩展,它也是C99中的标准,称为可变长度数组。
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
锵它支持由于GCC C和C99:http://clang.llvm.org/compatibility.html#vla
第6.7.5.2 Array declarators
:
如果尺寸不存在,则数组类型是一个不完整的类型。如果 大小为
*
代替 作为一个表达式,阵列类型是未指定大小, 只能在声明与函数原型 范围内使用的可变长度数组类型 )这种阵列是 仍然完全类型。如果大小是整数常量表达式 而且元素 类型具有已知的常量大小,则数组类型不是变量 长度数组类型;否则,数组类型是可变长度数组类型。
而且从6.5.3.4
一个例子:
#include <stddef.h> size_t fsize3(int n) { char b[n+3]; // variable length array return sizeof b; // execution time sizeof }
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf(不是标准,而是一个草案,并免费 :)
。