我这里有这个代码::
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);
}
Run Code Online (Sandbox Code Playgroud)
(请相应选择头文件)
当我将此代码作为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
Run Code Online (Sandbox Code Playgroud)
这是什么文件?为什么代码在C ??中失败?
Ideone参考::
C++ :: http://ideone.com/Ubb71k
在此先感谢您的任何帮助.. :)
o11*_*11c 11
所有版本的C++和C自C99起,return 0;在main结束之前添加一个隐含的内容.
C89(这是大多数编译器的默认设置)没有,所以如果你实际上从主要部分返回,那么它就是UB.
编辑:在实践中(假设您在没有消毒剂的情况下运行),这意味着您将返回$eax已经发生的任何事情,即最后一个函数的返回值.由于printf通常返回非零值,因此将其视为失败.