2010-08-16 3 views
13

Eventuali duplicati:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?Perché non è OK passare `char **` a una funzione che prende un `const char **` in C?

Sono curioso, perché non posso passare un char ** per const char ** funzione? Laddove è OK passare la funzione char * a const char *, sembra non essere corretto farlo con i doppi puntatori. Ho pensato che fosse sempre ok aggiungere constity (ma non ok per eliminare constness) ma ora sembra che mi sia sbagliato.

compilatore GCC mi sta dando l'errror:

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

Ecco il frammento di codice:

int f(const char **a) { } 

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

Tutte le idee?

+0

Questo sembra essere simile a http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c –

+2

BTW, a persone che votano per chiudere: questo non è un duplicato esatto di http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c dal quel uno riguarda specificamente 'const char * const *'. (Alcune delle risposte sono comunque rilevanti). – jamesdlin

risposta

16

Perché il compilatore non può garantire la sicurezza.

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

supporti eseguito la seguente serie più complicata di assegnazioni:

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

In linea 3, assegniamo un char ** a const char **. (Il compilatore dovrebbe lamentarsi). Nella riga 4, assegniamo uno const char * a const char *; questo è chiaramente legale. Nella riga 5, modifichiamo ciò che fa riferimento a char * - questo dovrebbe essere legale. Tuttavia, p1 termina con l'indicazione c, ovvero const. Ciò avvenne nella riga 4, perché *p2 era davvero p1. Questo è stato impostato nella riga 3, che è un'assegnazione di un modulo che non è consentito, e questo è esattamente il motivo per cui la riga 3 non è consentita.

Assegnare un char ** a un const char ** (come nella riga 3 e nella domanda originale) non è immediatamente pericoloso. Ma crea una situazione in cui la promessa di p2 - che il valore alla fine puntato non verrà modificato - non può essere mantenuta.