2013-11-13 6 views
0

компиляции этой программы:Почему небезопасно использовать `char **` для `const char **`?

#include <stdio.h> 

void main() { 
    char *s = "helo"; 
    char **sp = &s; 
    const char **csp = sp; 
    const char *cs = *csp; 
    printf("%s\n", cs); 
} 

получить предупреждение:

cc.c: In function ‘main’: 
cc.c:6:24: warning: initialization from incompatible pointer type [enabled by default] 
    const char **csp = sp; 
+3

http://www.parashift.com/c++-faq-lite/constptrptr-conversion.html <- Я знаю, что где-то есть дублирующий SO-ответ, но это ответ. –

ответ

1

char **sp

зр является указатель на указатель на символ и зр, * зр, и ** зр все изменяемые

const char **csp

csp является указатель на указатель на константный полукокс и, ПЕС и * ПСУ является изменчивым, но ** ПЕС Const

Теперь давайте посмотрит, почему const char** csp = sp не является безопасным.

const char Imconst = 'A'; 
char* ImMutable; 
const char** ImConstPtr = &ImMutable; // This is illegal but if it is allowed 
*ImConstPtr = &Imconst; 
*ImMutable = '1'; // We are trying to assign to "Imconst" 

Надеюсь, что это устраняет сомнения.

0

Предупреждение является потому, что символ ** и Const символ ** не эквивалентны. Правильно, вы могли бы исправить прототип (вызываемый) или исправить вызывающего (const char *).

найти фантастическую статью на http://c-faq.com/ansi/constmismatch.html

Смежные вопросы