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