5

I have this code here ::

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);
}

(Please choose the header files accordingly)

When I run this code as a C++ program, it runs smoothly. But, when I run it as a C program, it completes its execution, prints all the values, but on the last line of the code, gives a Runtime Error. I attached a debugger, and at the end of the program(while running this code in C) on clicking Step-Over, it takes me to a min_gw file, which looks something like this::

__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

What is this file?? And why does the code fail in C??

Ideone references ::

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

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

Thanks for any help in advance.. :)

user007
  • 2,156
  • 2
  • 20
  • 35

2 Answers2

11

All versions of C++, and C since C99, add an implicit return 0; at the end of main before falling off the end.

C89 (which is the default for most compilers) does not, so it is UB if you actually return from main by falling off the end.

Edit: In practice (assuming you are running without sanitizers), this means that you will return whatever happens to be in $eax already, i.e. the return value of the last function. Since printf usually returns a non-zero value, that is treated as failure.

o11c
  • 15,265
  • 4
  • 50
  • 75
0

You forgot the return statement in the end of main indicating success.

Andreas DM
  • 10,685
  • 6
  • 35
  • 62