為何在 C 語言中,char ** 無法安全轉換為 const char **?

最近在寫程式時,發現當我把一個 char ** 型態的變數,傳到一個 const char ** 型態的參數時,出現了以下的警告:

passing 'char *[257]' to parameter of type 'const char **' discards qualifiers in nested pointer types

char * 型態轉換為 const char * 是安全的,那為何會這樣呢?

那是因為 char ** 會含有 char * ,因此有可能可以透過其他 char * 去修改 const char * 中的值

以下是一個簡單的範例:

const char *bin = "/bin/sh";
char *argv[256];
const char **cargv = argv;  // Warning! Assigning char ** to const char **
cargv[0] = bin;             // perfectly legal; `cargv` and `bin` both are "char const"
*argv[0] = 0;               // Boom!

資料來源

Why does passing char** as const char** generate a warning?
I’ve been getting this warning: note: expected ‘const char **’ but argument is of type ‘char **’ For now, I’m passing the arguments by casting them to const char **. Is there any other way I can ...