Which is funny because the void keyword specifies that the function receives no arguments. Otherwise you could call it with any amount of arguments you want.
However, the linker doesn't care about type-signatures, so in the end this main function still gets called with argc, argv, envp.
The "any amount of arguments you want" applies to C function call. The mechanism for invoking your "main" function might use a different mechanism.
The C standard specifies (for hosted implementations) two ways to define "main", and allows implementations to document and support more. "int main(void)" is one of them. "int main()" is not. So, strictly speaking, using "int main()" makes your program's behavior undefined.
On the other hand, as far as I know every implementation actually allows "int main()" with no problem. This was necessary to support pre-ANSI C code, which couldn't use the "void" keyword. It's still better to be explicit and use "int main(void)" rather than "int main()". (It can also affect recursive calls to main, which are legal but almost certainly a bad idea.)
Which is why C++ makes use of name mangling, to achieve link time safety like in Mesa / Modula-2 derived languages, while relying on primitive UNIX linkers built for C semantics.