Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运行时错误与编译时错误_C_Compiler Errors_Runtime Error - Fatal编程技术网

C 运行时错误与编译时错误

C 运行时错误与编译时错误,c,compiler-errors,runtime-error,C,Compiler Errors,Runtime Error,我们最近参加了一次考试,我们得到了这个问题: 考虑以下代码片段: FILE * pFile; pFile = open ("myfile.txt","w+"); fprintf (pFile, "%f %s", 3.1416, "PI"); 以下哪项陈述是正确的 A) 程序在编译时生成错误 B) 程序在运行时生成错误 C) D) 我们无法使用编译器,而编写的信息是我们唯一拥有的。 正确的答案是B,运行时出错,有

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

考虑以下代码片段:

FILE * pFile;
pFile = open ("myfile.txt","w+");
fprintf (pFile, "%f %s", 3.1416, "PI");
以下哪项陈述是正确的

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

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

C)

D)

我们无法使用编译器,而编写的信息是我们唯一拥有的。 正确的答案是B,运行时出错,有人能给我详细解释一下原因吗

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

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

p、 美国。
我知道正确的函数应该是fopen,但这仍然不能解释为什么此代码有两个特定问题:

  • open
    的第二个参数需要一个
    int
    ,但会传递一个
    char*
  • open
    返回一个
    int
    ,但该值被分配给一个
    文件*
编译器将这些标记为警告而不是错误,因为该语言允许将指针转换为整数,并允许将整数转换为指针。然而,这样做通常是实现定义的,并且通常(如本例中所示)但并不总是表明存在问题

第6.3.2.3节描述了这些转换:

5整数可以转换为任何指针类型。除前面指定的情况外,结果是实现定义的, 可能未正确对齐,可能未指向实体 属于引用的类型,并且可能是陷阱表示形式

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