此问题已在此处有答案:
Why is this VLA (variable-length array) definition unreliable?(1个答案)
15天前关闭。
int i;
int n;
int dizi[n];
printf(" N: ");
scanf("%d",&n); // user input
srand(time(0));
for (i = 0; i < n; i++) { //
dizi[i]=rand();
printf("\n%d",dizi[i]);
}
字符串
我试着做一个由用户输入大小的数组。当我在循环中输入10而不是n时,我的输出总是有六个变量。
2条答案
按热度按时间deyfvvtc1#
代码中两个相关的东西导致了您看到的奇怪行为:1.代码在调用
scanf()
,2之前创建数组dizi[n]
。由于 1.n
没有被指定显式值,因此它的值仍然不确定。因此,您创建的数组的大小也是不确定的。此外,如果不确定值恰好为正,则代码的行为至少将限于使用未知值来调整数组大小的效果。(通常称为软件错误)但是,如果值恰好为负,则会调用UB,从而极大地扩展代码可能表现出的潜在行为。没有一个是可预测的。
请参阅下面的建议以及解释变更的注解:
字符串
balp4ylt2#
编译器不知道
n
的值是什么字符串
为您启动一个可变长度数组。这是
undefined behavior
(你称之为n
的垃圾值),它取决于哪个值以前在编译器定义n
的堆栈位置。在你的情况下,它是6,但可能是其他任何东西。