【发布时间】:2013-04-27 02:20:06
【问题描述】:
代码 1:
int n;
int c[n];
scanf("%d",&n);
代码 2:
int n;
scanf("%d",&n);
int c[n];
第一个给出分段错误,但第二个工作正常。
【问题讨论】:
-
未定义的行为,希望编译器生成一些代码。
-
这是未定义的行为。
代码 1:
int n;
int c[n];
scanf("%d",&n);
代码 2:
int n;
scanf("%d",&n);
int c[n];
第一个给出分段错误,但第二个工作正常。
【问题讨论】:
由于两个代码段都使用未初始化的变量,它们会调用未定义的行为(更不用说您正在传递 int,而您应该在其中传递 int*。对于未定义的行为,编译器无法保证会发生。它可能会像第一种情况一样崩溃,在第二种情况下不会产生错误,或者make demons fly out your nose。
发生的情况是,在一种情况下,n 的值恰好设置为可写地址,而在另一种情况下则没有。
【讨论】:
scanf("%d",&n);,在这种情况下第二个是正确的(如果输入了一个有效的正整数)。
int n; // n is uninitialized
int c[n]; // you're trying to declare an aray with an uninitialized value
【讨论】: