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

Oz1*_*123 1 c arrays strlen

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

char name[strlen(s)];

ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 8

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

你的选择是:

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

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