これが、C++ でchar **
が自動的に に変換されないconst char **
理由であり、C コンパイラがそれを許可しているときに警告を発する理由です。
/* This function returns a pointer to a string through its output parameter: */
void get_some_string(const char ** p) {
/* I can do this because p is const char **, so the string won't be modified. */
*p = "unchangeable string in program core";
}
void f() {
char * str;
/* First, I'll call this function to obtain a pointer to a string: */
get_some_string(&str);
/* Now, modify the string: */
for (char * p = str; *p; p++)
*p = toupper(*p);
/* We have just overwritten a constant string in program core (or crashed). */
}
何をするかについての説明から、ポインターも文字も変更しないため(ただし、ポインターを他の場所に複製するため)process_array_of_strings()
、同様にうまくいく可能性があります。const char * const *
その場合、上記のシナリオは不可能であり、コンパイラは理論的には警告なしで自動的に変換することを許可できますが、それは言語の定義方法ではありません。char **
const char * const *
したがって、答えは明らかにキャスト(明示的)が必要だということです。警告が表示される理由を完全に理解できるように、この説明を書きました。これは、警告を黙らせることにしたときに重要です。