运行时错误与编译时错误

卡斯塔伦扎

我们最近收到了一个问题,参加了考试:

考虑以下代码片段:

FILE * pFile;
pFile = open ("myfile.txt","w+");
fprintf (pFile, "%f %s", 3.1416, "PI");

下列哪个陈述是正确的?

A)程序在编译时产生错误

B)程序在运行时产生错误

C) 。

D)。

我们无法使用编译器,并且所写的信息是我们仅有的。正确答案最终是B,运行时错误,有人可以彻底解释一下为什么吗?

我知道编译器会生成警告,但是这里的重点是要理解为什么编译器让我们首先编译此代码,而不是给我们一个错误。

我的猜测是,即使不返回指针(它是一个地址),open也会给出仍然是int的fp,因此在编译器的眼中语法不是错误,但在运行时它可能会尝试访问导致错误的私有内存地址。

ps我知道正确的功能应该已经打开了,但这仍然不能解释为什么

dbush

此代码有两个特定的问题:

  • open期望的第二个参数,intchar *传递a
  • open返回一个,int但该值已分配给FILE *

编译器将这些标记为警告而不是错误,因为该语言允许将指针转换为整数,并允许将整数转换为指针。但是,这样做通常是定义实现的,并且通常(在这种情况下)但并不总是表示问题。

C标准的6.3.2.3节描述了这些转换:

5整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。

6任何指针类型都可以转换为整数类型。除非先前指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章