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 位系统上,char
和 char*
以不同的方式传递,这会导致崩溃。
因此,重申一下,问题是您没有正确识别问题 - 尽管如果您只按照说明进行操作,它是完全可以预防的。请阅读并理解how to ask a good question page。 您有责任,也只有您有责任在提交问题之前尽量减少问题并重现问题。
这是大一学生写的代码。我正在检查他的代码是错误的还是正确的。而且我发现了一个错误的点。这是由参数和参数的类型不匹配引起的。
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 位系统上,char
和 char*
以不同的方式传递,这会导致崩溃。
因此,重申一下,问题是您没有正确识别问题 - 尽管如果您只按照说明进行操作,它是完全可以预防的。请阅读并理解how to ask a good question page。 您有责任,也只有您有责任在提交问题之前尽量减少问题并重现问题。