Why do we need argc while there is always a null at the end of argv? Why do we need argc while there is always a null at the end of argv? c c

Why do we need argc while there is always a null at the end of argv?


Yes, argv[argc]==NULL is guaranteed. See C11 5.1.2.2.1 Program startup (my emphasis)

If they are declared, the parameters to the main function shall obey the following constraints:

The value of argc shall be nonnegative. argv[argc] shall be a null pointer.

Providing argc therefore isn't vital but is still useful. Amongst other things, it allows for quick checking that the correct number of arguments has been passed.

Edit: The question has been amended to include C++. n3337 draft 3.6.1 Main function says

2 ...argc shall be the number of arguments passed to the program from the environment in which the program is run. .... The value of argc shall be non-negative. The value of argv[argc] shall be 0.


Yes, argv[argc] is guaranteed to be a null pointer. argc is used for convenience.

Quoting the official explanation from C99 Rationale, note the words redundant check:

Rationale for International Standard — Programming Languages — C §5.1.2.2.1 Program startup

The specification of argc and argv as arguments to main recognizes extensive prior practice. argv[argc] is required to be a null pointer to provide a redundant check for the end of the list, also on the basis of common practice.


It's for historical reasons, and compatibility with old code. Originally, there was not a guarantee that there would exist a null pointer as the last element of the argv array. But argc has always existed.