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

时间:2015-06-23 23:22:35

标签: 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);
}

(请相应选择标题文件)

当我将此代码作为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

感谢您提前提供任何帮助.. :)

2 个答案:

答案 0 :(得分:11)

C ++的所有版本,以及C99以来的C,在main结尾处添加隐式return 0;,然后才会结束。

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

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

答案 1 :(得分:0)

你在主要结尾处忘记了返回声明,表明成功。