我已经读过,如果未明确初始化数组,则声明数组说明符是必需的, 但是这段代码编译并成功运行?
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);
}
答案 0 :(得分:1)
这是使用C99的可变长度数组功能的有效代码。
只要r
正确设置了scanf
,就可以在分配char array[r]
时使用它。
但有几个问题需要解决:
scanf
返回零,则r
仍然未初始化。使用它来声明声明中的数组大小是非法的。scanf
读取负数,则将其用作数组大小将是非法的。scanf
读取的数字对于系统的自动内存空间来说太大,则会遇到未定义的行为。最后一点非常重要:您的系统可能有足够的内存用于阵列,但在自动内存(通常称为“堆栈”)中没有足够的空间来分配阵列。这可能会导致崩溃。
更好的方法是使用malloc
动态分配数组,并在完成后动态分配free
。