这段代码片段会在VC6.0中崩溃吗?

时间:2012-12-21 08:52:12

标签: c

int main(void) {

      int i = 0;
      scanf("%f", &i);

      return 0;
}

据称,如果我输入一个浮点数,它就会崩溃。

我在Gcc4.7中测试它,它有效。 我没有VC6.0,所以我想知道它是否会在VC6.0中崩溃。

如果会的话,为什么?有人告诉我,因为FPU没有初始化?

3 个答案:

答案 0 :(得分:2)

  int i = 0;
  scanf("%f", &i);

你想:

  scanf("%d", &i);

代替。

%f中的

scanf需要一个指向float的类型指针的参数。将类型指针的参数传递给int是未定义的行为。

答案 1 :(得分:2)

此代码导致未定义行为 如果它有效,你就是(联合国)幸运的。它不能保证工作。它可能会失败或工作。

您有责任确保格式说明符与printfscanf中传递的实际类型相匹配。由于i的实际类型int,因此正确的格式说明符应为%d

  scanf("%d", &i);

答案 2 :(得分:1)

我认为这是指旧版本的microsoft(和borland,可能还有其他)编译器,除非编译器检测到你使用了浮点(或者使用了一些特殊的编译器选项来强制执行),否则代码中不会有浮点函数它)。这是一个非常无意义的例子,因为这个代码绝对没有办法以合理的方式工作。如果您真的想要将浮点值填充到整数中,则使用类型双精度指针强制转换或联合是“已批准”的方式。

现在不太相关,因为通用函数(例如* printf和* scanf)的浮点支持通常在主标准库中提供,并且正确编写的代码不会有任何问题。

我相信如果你在printf中使用%f(或%g),同样的问题也适用。