Definitions of main other than the standard ones work because of C linkage. The linker just sees that youve defined the symbol "main" and calls. The data passed is still the exact same though. If you define main to take two integers, its probably going to have arg count as the first integer, and part of the first argument string (interpretted as an integer) as the second integer and the pointer to the array of strings (interpreted as an integer) as the second integer.
Iirc, compilers require standard strict options enabled for whatever reason in order to catch the problem.