I know that in C compilers the main()
function is called by the _start()
function which has code something like this:
exit(main()); // return value of main is returned
How does _start()
work when main()
does not return int
, for example if its return type is void
, float
, or something else?
This question already has answers here:In most cases int main() does not return anything, it doesn't even have to since no return would not give an error.
If no return statement appears in a function definition, control automatically returns to the calling function after the last statement of the called function is executed. In this case, the return value of the called function is undefined.
The normal exit of program is represented by zero return value. If the code has errors, fault etc., it will be terminated by non-zero value. In C++ language, the main() function can be left without return value.
In C++ the default return type of main is void, i.e. main() will not return anything. But, in C default return type of main is int, i.e. main() will return an integer value by default.
If main
doesn't return int
, then you have an ill-formed program and behavior is undefined. Anything can happen. Your program might crash, or it might run as though nothing were wrong at all.
Let's suppose main
returned something other than int
, and your compiler and linker allowed the program to be made. The caller doesn't know that, though. If the caller expects returned int
values to be returned in the EAX (Intel) register, then that's what it will read to determine the return value of main
. If your faulty main
stored a float
value there, then it will be interpreted as an int
instead. (That doesn't mean it will get truncated. It means the bits making up the layout of a floating-point value will instead make up an int
instead.) If your faulty main
returned void
, then it didn't store anything in the expected register, so the caller will get whatever value was previously stored in that register instead.
If your main
returns some type that it expects to store someplace that the caller didn't' reserve memory for (such as a large struct), then it will end up overwriting something else, perhaps something important to the clean shutdown of the program, causing your program to crash.
The C standard never mentions this _start
function; I don't believe C++ does either.
In C prior to the 1999 ISO standard, if execution reaches the end of main()
without executing a return
statement, or executes a return
statement that doesn't specify a value, then "the termination status returned to the host environment is undefined". In practice, I've seen implementations where such a program returns a status of 1 (failure), or some arbitrary value in memory such as the result of the last function that was called.
The 1999 ISO C standard changed this: "reaching the } that terminates the main function returns a value of 0". This matches the rule that C++ has had at least since the first ISO C++ standard in 1998.
(As a matter of style, I prefer to have an explicit return 0;
at the end of main
, even if it's not strictly required. This is consistent with int
functions other than main
, and it makes for better portability to pre-C99 C compilers.)
All this assumes that main
is defined with a return type of int
. That's the only type that's specifically supported by the C standard (either int main(void)
or int main(int argc, char *argv[])
or equivalent), but (hosted) implementations may support other implementation-defined definitions. The C90 standard doesn't explicitly cover this case, but C99 says, "If the return type is not compatible with int, the termination status returned to the host environment is unspecified."
The C++ standard is a bit different. For hosted implementations, main
must be defined to return int
. The parameters are implementation-defined, but both the standard forms of C must be supported.
For a hosted implementation in either C or C++, there is no good reason I know of to define main
with a return type other than int
. Just use one of the two standard definitions, and the question won't arise.
For "freestanding implementations", "the name and type of the function called at program startup are implementation-defined". So the entry point might legitimately return void
or something else, and it might not even be called main
. Note that a "freestanding implementation" is one "in which C program execution may take place without any benefit of an operating system", typically an embedded system.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With