我知道我不应该在 C90 中这样做,这是一个相当基本的东西。
char name[strlen(s)];
ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’
他们想让我专门使用 malloc 吗?我只是好奇它背后的逻辑。
这是被禁止的,因为 C90 不支持可变长度数组 (VLA)。真的就这么简单。
您的选择是:
malloc
)。malloc
,没有能够检查分配是否成功的概念)。[注意:如果您要分配一个数组以制作 的副本s
,您需要使用strlen(s)+1
它作为大小(记住空终止符)。]
并不是“他们”不想让你这样做,它根本不是语言的一部分(或者更确切地说,不是在 1999 年之前)。标准解决方法是使用malloc
or alloca
。(alloca
本质上与可变长度数组分配相同,但不是标准函数,因此它可能不适用于所有感兴趣的系统。此外,有些人强烈反对它的使用,但他们倾向于强烈反对可变长度阵列出于相同的原因。)
这个警告指出使用 GNU gcc 扩展是一个严重的可移植性问题。
该代码是非法的,因为 strlen(s) 的值在编译时是未知的。GNU gcc 为基于运行时值分配的自动数组提供了扩展;但是依赖这些会使代码不符合标准。
如果直到运行时才知道 strlen(s) 的值,则可以通过转换为在约定数组上显式执行分配/解除分配或使用 STL 容器来使代码合规。(例如 std::vector )。
这是一个语言对编译器的假定便利性及其预期的运行时环境有限制的问题。