我这里有这个代码::
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/Ubb71k
感谢您提前提供任何帮助.. :)
答案 0 :(得分:11)
C ++的所有版本,以及C99以来的C,在main结尾处添加隐式return 0;
,然后才会结束。
C89(这是大多数编译器的默认设置)没有,所以如果你实际上从主要部分返回,则为UB。
编辑:在实践中(假设您在没有消毒剂的情况下运行),这意味着您将返回已经在$eax
中发生的任何事情,即最后一个函数的返回值。由于printf
通常会返回非零值,因此将其视为失败。
答案 1 :(得分:0)
你在主要结尾处忘记了返回声明,表明成功。