2011-05-28 95 views
1

为什么当我尝试编译包含以下两行的代码时,gcc或clang都不会生成错误?gcc错误生成

int palindrome(char s[]){ 
    char s2[strlen(s)]; 

我想在这样的情况下,你将不得不动态地分配内存到S2。

回答

2

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(不是标准,而是一个草案,并免费 :)