>> It wasn't "const char *const *argv" before because a "char **" >> argument is not compatible with such a parameter, and C programs >> canonically take "char **argv", not "const char *const *argv". I'm >> not sure if it's even valid C to silently change from char * to const >> char * without an explicit cast, which is what you'd be doing if you >> wrote a main() which accepted a list of const char pointers intead of >> a list of char pointers.
> Don't be silly, you can always pass a non-const value for a const > arg. Same with silent promotions of int to long, etc. The compiler can only promote the top-level parameter, not the contents of an array. Observe: equal-rites% cat test.c void foo(const char *const *a) { ; } void bar() { char **b = 0; foo(b); } equal-rites% gcc -c -Wall test.c test.c: In function `bar': test.c:2: warning: passing arg 1 of `foo' from incompatible pointer type