En C/C++, argc puede ser 0

Esta semana he continuado leyendo Accelerated C++. Intento seguir un ritmo de un capítulo diario, habiendo llegado ya al capítulo 10 (aproximadamente dos tercios del libro). Confío en acabarlo a lo largo de esta semana.

Hoy he descubierto una cosa curiosa. La mayoría de los programas en C/C++ incluye una línea similar a int main(int argc, char **argv) o su equivalente int main(int argc, char* argv[]) para permitir pasarle argumentos.

argv es un puntero a un array de punteros, uno para cada argumento, y argc es el número de punteros del array. El elemento inicial del array, argv[0], representa el nombre con el que se ha llamado al programa, y argv[argc] es siempre un puntero nulo. Los argumentos -si los hay- ocupan los restantes elementos del array, de argv[1] a argv[argc - 1].

Así pues, aparentemente argc debe siempre ser mayor o igual que 1. Sin embargo, resulta que como explican en stackoverflow y alt.comp.c, el estándar dice explícitamente que argc puede ser cero. Y es que por medio de las llamadas al sistema exec() de POSIX, argv[0] puede ser NULL.