gpt4 book ai didi

c++ - 在 C++ 中工作正常,但在 C 中运行时错误

转载 作者:太空狗 更新时间:2023-10-29 14:53:59 25 4
gpt4 key购买 nike

我这里有这段代码::

int f(int x, int *py, int **ppz)
{
int y, z;
**ppz += 1;
z = **ppz;
*py += 2;
y = *py;
x += 3;
return x + y + z;
}

int main()
{
int c, *b, **a;
c = 4;
b = &c;
a = &b;
printf( "%d\n", f(c,b,a));
printf( "%d\n", c);
}

(请相应地选择头文件)

当我将此代码作为 C++ 程序运行时,它运行顺利。但是,当我将它作为 C 程序运行时,它完成了执行,打印了所有值,但在代码的最后一行,给出了运行时错误。我附加了一个调试器,在程序结束时(在 C 中运行此代码时)单击 Step-Over,它将我带到一个 min_gw 文件,它看起来像这样::

__mingw_CRTStartup()
__mingw_CRTStartup+208: mov %eax,%ebx
__mingw_CRTStartup+210: call 0x407fb0 <_cexit>
__mingw_CRTStartup+215: mov %ebx,(%esp)
__mingw_CRTStartup+218: call 0x408088 <ExitProcess@4>
__mingw_CRTStartup+223: nop

这是什么文件??为什么代码在 C 中会失败??

Ideone 引用::

C::http://ideone.com/sDbqnI

C++::http://ideone.com/Ubb71k

提前感谢您的帮助..:)

最佳答案

所有版本的 C++,以及自 C99 以来的 C,都在 main 的末尾添加一个隐式的 return 0;,然后从末尾掉落。

C89(这是大多数编译器的默认设置)没有,所以如果您实际上是通过从末尾掉下来从 main 返回,它就是 UB。

编辑:实际上(假设您在没有 sanitizer 的情况下运行),这意味着您将返回 $eax 中已经存在的任何内容,即最后一个函数的返回值。由于 printf 通常返回非零值,因此被视为失败。

关于c++ - 在 C++ 中工作正常,但在 C 中运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31015112/

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