gpt4 book ai didi

cl.exe(32位)和cl.exe(64位)具有相同的版本,但为什么它们不等效?

转载 作者:行者123 更新时间:2023-11-30 20:23:32 24 4
gpt4 key购买 nike

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

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

这是一个函数的原型(prototype)。然而他用不同的参数调用该函数。像这样。

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

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

但是,当我使用 cl.exe(32 位)编译相同的文件时,并没有发生运行时错误。当然有很多编译警告,但至少执行得很好。看来cl.exe(32位)比64位的宽容度更高。但他们有相同的版本。(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您有责任将问题最小化并能够在提交问题之前重现问题。

关于cl.exe(32位)和cl.exe(64位)具有相同的版本,但为什么它们不等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com