Solo para aclarar el tópico de la definición de la función principal "main":
Al principio del tema se cita otro donde se indica:
2. "main ()", "void main ()", "int main (void)" no son correctos (el último sería aceptable, pero no suele usarse).
3. "int main (int argc, char *argv [])". Es lo más correcto, pero lo que hay entre paréntesis puede suprimirse si no es usado en el programa.
Ello no es completamente correcto, explico porque:
* El estándar de C indica que la definición de la función principal debe ser una de dos formas:
A) Si no se procesan los argumentos pasados mediante la linea de comandos:
int main(void){
/* ... */
}
B) Si ellos se procesan:
int main(int argc, char *argv[])
{
/* ... */
}
O alguna equivalente, por ejemplo al utilizar macros (con la directiva "#define ...") o alias (con la palabra reservada "typedef"). También se debe considerar que en una
definición los paréntesis vacíos indican "no argumentos" así que "int main() ..." también es valida.
Otras formas de definir la función principal pueden ser validas o no (ese es el problema) ya que dependerán del compilador utilizado (este las puede aceptar como una extensión al lenguaje).
----
En cuanto al valor de retorno de la función principal: cuando una función debe retornar un valor (su tipo de retorno no es "void") si este no se indica el resultado es un valor no definido o "basura".
Ese es el caso con "main" en el estándar C90. En el estándar C99 aplica lo mismo que en C++: si el valor de retorno de la función "main" no se indica este se toma como cero pero (usualmente) se agrega de todos modos (como una "buena costumbre").
Un saludo