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.