cl.exe(32bit) 和 cl.exe(64bit) 版本相同,为什么不等价?

cl.exe(32bit) and cl.exe(64bit) have the same version, but why aren't they equivalent?

这是大一学生写的代码。我正在检查他的代码是错误的还是正确的。而且我发现了一个错误的点。这是由参数和参数的类型不匹配引起的。

void make_data(FILE *fp,char,int n);

这是一个函数的原型。然而,他用不同的参数调用了这个函数。像这样。

make_data(fin, "input.txt", 10);

错误的地方很明显——他以错误的方式声明了函数原型。我首先用 cl.exe(64bit) 编译了这段代码并执行了程序。它在 运行 时间内停止。

然而,当我用 cl.exe(32bit) 编译同一个文件时,它并没有发生 运行-time 错误。当然有很多编译警告,但至少它执行得很好。似乎 cl.exe(32bit) 比 64bit 的更宽容。但它们具有相同的版本。(16.00.30319.01)。那为什么他们的行为方式不同呢?

我了解这是未定义的行为。我知道 Visual C 编译器可能与 gcc 有很大不同——因为 C 语言没有定义所有的细节。我想知道的是为什么32位系统和64位系统的编译器应该是这样不同的。

您显示的代码是有效的 C。它是荒谬的,但就 C 语义而言,它是有效的并且不调用 UB。

完整示例:

#include <stdio.h>

void make_data(FILE *fp, char a, int n) {
   printf("%p %c %d\n", fp, a, n);
}

int main()
{
   FILE * fin = NULL;
   make_data(fin, "input.txt", 10);
}

示例输出:

0x0 2 10

您没有告诉我们的是,声明在不同的翻译单元中是不同的。例如。在 file1.c 中有一个 void make_data(FILE*, char, int); 声明,在 file2.c 中有一个 void make_data(FILE*, char*, int) { ... } 定义。在 64 位系统上,charchar* 以不同的方式传递,这会导致崩溃。

因此,重申一下,问题是您没有正确识别问题 - 尽管如果您只按照说明进行操作,它是完全可以预防的。请阅读并理解how to ask a good question page您有责任,也只有您有责任在提交问题之前尽量减少问题并重现问题。