2010-08-16 17 views
13

Duplicar posible:
Why can’t I convert ‘char**’ to a ‘const char* const*’ in C?¿Por qué no está bien pasar `char **` a una función que toma `const char **` en C?

Tengo curiosidad, ¿por qué no puedo pasar una char ** a const char ** función? Mientras que está bien pasar char * a una función const char * parece que no está bien hacerlo con dos punteros. Pensé que siempre estaba bien agregar constness (pero no está bien para dejar constness) pero ahora parece que he estado equivocado.

compilador GCC me está dando el errror:

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

Aquí es el fragmento de código:

int f(const char **a) { } 

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

¿Alguna idea?

+0

Esto parece ser similar a http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c –

+2

Por cierto, a personas que votan para cerrar: este no es un duplicado exacto de http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-inc ya que eso uno es específicamente sobre 'const char * const *'. (Algunas de las respuestas allí son relevantes, sin embargo). – jamesdlin

Respuesta

16

Porque el compilador no puede garantizar la seguridad.

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

supongamos que ha realizado la siguiente serie más complicada de asignaciones:

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

En la línea 3, asignamos una char ** a const char **. (El compilador debería presentar una queja). En la línea 4, asignamos un const char * a un const char *; esto es claramente legal. En la línea 5, modificamos lo que apunta a char *: se supone que es legal. Sin embargo, p1 termina apuntando a c, que es const. Esto sucedió en la línea 4, porque *p2 fue realmente p1. Esto se configuró en la línea 3, que es una asignación de un formulario que no se permite, y esta es exactamente la razón por la cual no se permite la línea 3.

Asignar un char ** a un const char ** (como en la línea 3, y en la pregunta original) no es inmediatamente peligroso. Pero establece una situación en la que no se puede cumplir la promesa de p2 de que el valor final no se modificará.

Cuestiones relacionadas