2010-08-16 44 views
13

可能重複:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?爲什麼把`char **`傳遞給一個在C中使用`const char **`的函數是不行的?

我很好奇,爲什麼我不能傳遞一個char **const char **功能?因爲可以將char *傳遞給const char *函數,所以用雙指針來做它似乎並不好。我認爲添加常量總是可以的(但不能放棄常量),但現在看來我錯了。

gcc編譯是給我的errror:

note: expected ‘const char **’ but argument is of type ‘char **’ 

這裏是代碼片段:

int f(const char **a) { } 

int main() { 
    char *a; 
    f(&a); 
} 

任何想法?

+0

這看起來類似於http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c – 2010-08-16 18:24:11

+2

順便說一句,以投票結束的人:這不是http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c的確切副本,因爲一個是關於'const char * const *'的。 (然而,有些答案是相關的。) – jamesdlin 2010-08-17 03:23:58

回答

16

因爲編譯器不能保證安全。

見Q11.10從comp.lang.c常見問題:Why can't I pass a char ** to a function which expects a const char **?

假設你執行了以下比較複雜一系列 分配:

const char c = 'x'; /* 1 */ 
char *p1;    /* 2 */ 
const char **p2 = &p1; /* 3 */ 
*p2 = &c;    /* 4 */ 
*p1 = 'X';    /* 5 */ 

在第3行,我們給一個char **const char **。 (編譯器應該抱怨。)在第4行中,我們將const char *分配給const char *;這顯然是合法的。在第5行中,我們修改了char *指向的內容 - 這應該是合法的。但是,p1最終指向c,即const。這是第4行,因爲*p2真的是p1。這是在第3行建立的,這是一個不允許的表單的分配,這正是爲什麼第3行不被允許。

char **指定爲const char **(如第3行和原始問題中所述)並不是立即危險的。但它確立了一種情況,即不能保持最終指向的價值不會被改變的p2的承諾。

相關問題