La réponse à cette question dépend du compilateur. Cela signifie qu'elle n'est pas traitée dans le standard C, donc n'importe qui peut l'implémenter comme il ou elle le souhaite. C'est normal, car les systèmes d'exploitation n'ont pas non plus de méthode standard et communément acceptée pour démarrer et terminer les processus.
Imaginons un simple scénario du type "pourquoi pas".
Le processus reçoit par un certain mécanisme les arguments écrits dans la ligne de commande. argc est alors juste un int qui est poussé sur la pile par la fonction bootstrap que le compilateur a mis comme point d'entrée pour le processus du programme (partie du runtime). Les valeurs réelles sont obtenues du système d'exploitation, et peuvent être, par exemple, écrites dans un bloc de mémoire du Heap. Ensuite, le vecteur argv est construit et l'adresse de sa première position est également poussée dans la pile.
Ensuite, la fonction main(), qui doit être fournie par le programmeur, est appelée et sa valeur de retour est enregistrée pour une utilisation ultérieure (presque immédiate). Les structures du Heap sont libérées, et le code de sortie obtenu pour main est exporté vers le système d'exploitation. Le processus se termine.