在运行时定义数组大小

时间:2017-05-24 16:29:35

标签: c arrays

我已经读过,如果未明确初始化数组,则声明数组说明符是必需的, 但是这段代码编译并成功运行?

main()
{
   int r;
   scanf("%d",&r);
  char array[r];      //memory is not allocated at compile as value of variable is not known
  scanf("%s",array);
  printf(array);





}

1 个答案:

答案 0 :(得分:1)

这是使用C99的可变长度数组功能的有效代码。

只要r正确设置了scanf,就可以在分配char array[r]时使用它。

但有几个问题需要解决:

  • 如果scanf返回零,则r仍然未初始化。使用它来声明声明中的数组大小是非法的。
  • 如果scanf读取负数,则将其用作数组大小将是非法的。
  • 如果scanf读取的数字对于系统的自动内存空间来说太大,则会遇到未定义的行为。

最后一点非常重要:您的系统可能有足够的内存用于阵列,但在自动内存(通常称为“堆栈”)中没有足够的空间来分配阵列。这可能会导致崩溃。

更好的方法是使用malloc动态分配数组,并在完成后动态分配free