Curiosidad en C

Tenía la curiosidad de que pasaría en un programa C con el siguiente código:

int main (void)
{
return(main());
}

Por un lado la función main, y por lo tanto el programa, acaban cuando se sale de esa función, bien porque ha acabado, bien porque se hace un return (como en este caso), o bien porque se ha abortado la ejecución, por ejemplo con exit.

Por otro lado, el programa empieza cuando se ejecuta main.

En este código, main acaba volviendo a llamarse a si mismo… Así que no sabía a ciencia cierta que pasaría. Seguramente todo acabaría con un desbordamiento de pila.

¿Cuál sería el resultado de un programa que acaba iniciándose de nuevo?

Así que he cogido el Visual C++ 6.0 SP5 de Microsoft, y he probado dicho código en un ejecutable de consola.

Podeis descargar el espacio de trabajo, el proyecto, el fuente y el compilado de aquí.

El resultado es de nuevo curioso. El programa nunca acaba, pero tampoco genera un desbordamiento de pila (y eso que me he asegurado de que las llamadas fueran por pila con la convención _cdecl).

Nunca te acostarás sin aprender algo nuevo…



2 comentarios en “Curiosidad en C”

  1. Curioso experimento 😉 Supongo que el compilador debe implementar la optimización de recursividad por cola, que borra el bloque de activación de la función cuando ésta contiene como última instrucción una llamada a otra función… O algo así 😉

  2. El Visual C++ es muy raro…

    Además compilé con optimizaciones para tamaño, así que no te extrañe que ni siquiera llamase a la función main() más de una vez, al detectar que su invocación no hacía nada.

    Otro día que tenga más tiempo, desensamblo el código a ver que es lo que está haciendo realmente.

Deja un comentario