2012-12-06 10 views
6

Eventuali duplicati:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)una cattiva chiamata con una firma const in C

Perché ottengo un avvertimento (gcc 42,2) con la seguente chiamata di foo?

void foo(const char **str) 
{ 
    (*str)++; 
} 

(...) 
char **str; 
foo(str); 
(...) 

capisco perché non possiamo chiamare una funzione che ad eccezione di un char ** con un const char **, ma il contrario sembra ok per me, quindi perché il seguente avviso?

warning: passing argument 1 of 'foo' from incompatible pointer type 
+4

qual è l'avviso? –

+0

scusa, l'ho appena aggiunto – Guid

+0

quali tag di compilazione stai usando? –

risposta

8

È sbagliato. Non c'è spazio per discutere con il compilatore qui, poiché è supportato dalle specifiche. Ecco un esempio che spiega esattamente perché è sbagliato:

void func(const char **p) 
{ 
    *p = "abc"; 
} 

void func2(void) 
{ 
    char *a; 
    func(&a); 
    *a = 'x'; 
} 

Se il compilatore non sputare fuori un errore, il programma sarebbe probabilmente crash perché saresti sovrascrive una stringa letterale (che è spesso contrassegnato sola lettura solo in memoria).

Così non si può implicitamente espressi char ** per const char ** perché consentirebbe di rimuovere il qualificatore const da qualsiasi valore - in fondo, permetterebbe di ignorare const a volontà, senza un cast esplicito.

Il motivo principale per cui il compilatore fornisce un avvertimento invece di un errore è perché un sacco di vecchio codice non utilizza il qualificatore const dove sarebbe se il codice fosse scritto oggi.

Problemi correlati