<分区>
我读到在声明数组时如果没有显式初始化,大小说明符是强制性的, 但是给定的代码段编译并成功运行了吗?
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);
}
<分区>
我读到在声明数组时如果没有显式初始化,大小说明符是强制性的, 但是给定的代码段编译并成功运行了吗?
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);
}
最佳答案
这是利用 C99 的可变长度数组特性的有效代码。
只要 r
被 scanf
正确设置,在 char array[r]
的分配中使用它是合法的。
不过,有几个问题需要解决:
scanf
返回零,r
保持未初始化状态。在声明中使用它来指定数组大小是非法的。scanf
读取负数,将其用作数组大小将是非法的。scanf
读取的数字对于系统的自动内存空间而言太大,您将遇到未定义的行为。最后一点非常重要:您的系统可能有足够的内存用于数组,但自动内存(通常称为“堆栈”)中没有足够的空间来分配您的数组。这可能会导致崩溃。
更好的方法是使用 malloc
动态分配您的数组,并在完成后释放
它。
关于c - 在运行时定义数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44163939/