【问题标题】:How does the working of compiler differs in both cases although in both cases, n is unknown to compiler during compile time? [closed]尽管在这两种情况下,编译器在编译期间都不知道 n ,但编译器的工作方式在这两种情况下有何不同? [关闭]
【发布时间】:2013-04-27 02:20:06
【问题描述】:

代码 1:

int n;
int c[n];
scanf("%d",&n);

代码 2:

int n;
scanf("%d",&n);
int c[n];

第一个给出分段错误,但第二个工作正常。

【问题讨论】:

  • 未定义的行为,希望编译器生成一些代码。
  • 这是未定义的行为。

标签: c arrays concept


【解决方案1】:

由于两个代码段都使用未初始化的变量,它们会调用未定义的行为(更不用说您正在传递 int,而您应该在其中传递 int*。对于未定义的行为,编译器无法保证会发生。它可能会像第一种情况一样崩溃,在第二种情况下不会产生错误,或者make demons fly out your nose

发生的情况是,在一种情况下,n 的值恰好设置为可写地址,而在另一种情况下则没有。

【讨论】:

  • 我怀疑实际上调用是scanf("%d",&n);,在这种情况下第二个是正确的(如果输入了一个有效的正整数)。
【解决方案2】:
int n;     // n is uninitialized
int c[n];  // you're trying to declare an aray with an uninitialized value

【讨论】:

  • 你没有提到 scanf 是这里最大的错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2020-03-13
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多