2010-08-16 10 views
13

Powiel możliwe:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?Dlaczego przekazanie `char **` do funkcji, która przyjmuje `const char **` w C, nie jest w porządku?

Jestem ciekaw, dlaczego nie mogę zdać char ** do const char ** funkcja? Gdzie jest OK, aby przekazać char * do funkcji const char * wydaje się nie być w porządku, aby zrobić to za pomocą podwójnych wskaźników. Myślałem, że zawsze było w porządku, aby dodać constness (ale nie w porządku, aby obniżyć constness), ale teraz wydaje się, że się pomyliłem.

kompilator gcc daje mi errror:

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

Oto fragment kodu:

int f(const char **a) { } 

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

Jakieś pomysły?

+0

To wydaje się być podobna do http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c –

+2

BTW, do osoby głosujące na zamknięcie: nie jest to dokładny duplikat http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c, ponieważ w szczególności chodzi o 'const char * const *'. (Niektóre z odpowiedzi są jednak istotne). – jamesdlin

Odpowiedz

16

Ponieważ kompilator nie może zagwarantować bezpieczeństwa.

See Q11.10 z comp.lang.c FAQ: Why can't I pass a char ** to a function which expects a const char **?

załóżmy, że wykonano następujące bardziej skomplikowaną serię zadań:

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

W wierszu 3, przydzielamy char ** do const char **. (Kompilator powinien narzekać.) W linii 4, przypisujemy const char * do const char *; jest to wyraźnie legalne. W linii 5 modyfikujemy to, co wskazuje char * - to ma być legalne. Jednakże, p1 kończy się wskazując na c, który jest const. Doszło do tego w linii 4, ponieważ *p2 było naprawdę p1. Zostało to ustawione w linii 3, która jest przypisaniem formularza, który jest niedozwolony, i właśnie dlatego linia 3 jest niedozwolona.

Przypisanie char ** do const char ** (jak w linii 3, oraz w pytaniu oryginalnym) nie jest natychmiast niebezpieczne. Ale to stwarza sytuację, w której obietnica - że ostatecznie wyznaczona wartość nie zostanie zmodyfikowana - nie może być zachowana.

Powiązane problemy