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

use*_*007 5 c c++

我这里有这个代码::

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/sDbqnI

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

在此先感谢您的任何帮助.. :)

o11*_*11c 11

所有版本的C++和C自C99起,return 0;在main结束之前添加一个隐含的内容.

C89(这是大多数编译器的默认设置)没有,所以如果你实际上从主要部分返回,那么它就是UB.

编辑:在实践中(假设您在没有消毒剂的情况下运行),这意味着您将返回$eax已经发生的任何事情,即最后一个函数的返回值.由于printf通常返回非零值,因此将其视为失败.

  • 据我所知,从C99标准来看,这也是在C中隐含添加的. (2认同)