2

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

char name[strlen(s)];

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

他们想让我专门使用 malloc 吗?我只是好奇它背后的逻辑。

4

4 回答 4

9

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

您的选择是:

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

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

于 2011-12-21T20:58:09.383 回答
1

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

于 2011-12-21T21:01:33.650 回答
0

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

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

如果直到运行时才知道 strlen(s) 的值,则可以通过转换为在约定数组上显式执行分配/解除分配或使用 STL 容器来使代码合规。(例如 std::vector )。

于 2011-12-21T21:00:57.380 回答
0

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

于 2011-12-21T21:03:39.097 回答