为什么禁止变长数组:“C90禁止变长数组”?

时间:2011-12-21 20:56:39

标签: c arrays strlen

我知道我不应该在C90中这样做,而且这是一个相当基本的东西。

char name[strlen(s)];

ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’

他们是否要我专门使用malloc?我只是好奇这里背后的逻辑。

4 个答案:

答案 0 :(得分:8)

这是禁止的,因为C90不支持可变长度数组(VLA)。它真的很简单。

您的选择是:

  • 声明一个固定长度的数组,可以处理您想要使用的最大字符串长度。
  • 动态分配数组(使用malloc)。
  • 使用为VGA提供非标准语言扩展的编译器,例如: GCC。 (我不推荐这个,因为这意味着你最终会编写不可移植的代码。)
  • 使用C99代替,支持VLA。请注意,在堆栈上分配了VLA,如果您的堆栈空间不足,可能会导致各种问题(与malloc不同,没有能够检查分配是否成功的概念)。

[ 注意: 如果您要分配数组以制作s的副本,则需要使用{ {1}}作为大小(记住空终止符)。]

答案 1 :(得分:1)

并不是“他们”不希望你这样做,它根本不是语言的一部分(或者更确切地说,不是1999年之前)。标准解决方法是使用mallocalloca。 (alloca基本上与可变长度数组分配相同,但不是标准函数,因此它可能不适用于所有感兴趣的系统。此外,有些人强烈反对它的使用,但他们倾向于反对由于同样的原因,强到可变长度数组。)

答案 2 :(得分:0)

此警告指出使用GNU gcc扩展是一个严重的可移植性问题。

代码是非法的,因为strlen(s)的值在编译时是未知的。 GNU gcc为基于运行时值分配的自动数组提供扩展;但依赖于这些使得代码不符合标准。

如果strlen(s)的值在运行时才知道,那么可以通过转换为在约定数组上显式执行分配/释放或使用STL容器来使代码符合规范。(例如std ::向量)。

答案 3 :(得分:0)

语言的问题是对假定的方便性有限制 编译器及其预期的运行时环境。