2010-08-13 18 views
24

yo escribimos el siguiente código:advertencia: asignación descarta calificadores de tipo de destino puntero

void buildArrays(char *pLastLetter[],int length[], int size, const char str[]) { 

    int i; 
    int strIndex = 0; 
    int letterCounter = 0; 

    for (i=0; i<size; i++) { 

     while ((str[strIndex] != SEPERATOR) || (str[strIndex] != '\0')) { 
      letterCounter++; 
      strIndex++; 
     } 
     pLastLetter[i] = &str[strIndex-1]; 
     length[i] = letterCounter; 
     letterCounter = 0; 
     strIndex++; 
    } 
} 

y yo estoy haciendo la advertencia anterior sobre pLastLetter[i] = &str[strIndex-1];

pLastLetter is a pointers array that points to a char in str[].

Cualquiera sabe ¿Por qué lo obtengo y cómo solucionarlo?

Respuesta

32

Bueno, como usted mismo ha dicho, pLastLetter es una matriz de punteros char *, mientras str es una matriz de const char. La expresión &str[strIndex-1] tiene el tipo const char*. No puede asignar un valor const char* a un puntero char *. Eso violaría las reglas de const-correctness. De hecho, lo que está haciendo es un error en C. Los compiladores tradicionalmente lo reportan como una mera "advertencia" para evitar romper algún viejo código heredado.

En cuanto a "cómo solucionarlo" ... Depende de lo que está tratando de hacer. Haga pLastLetter una matriz de const char* o elimine const de str.

+0

muchas gracias por la respuesta rápida, lo que me lleva a otra pregunta: si esta es la función: void buildArrays (char * pLastLetter [], int length [], int size, const char str []) ¿está bien llamar a esta función por: buildArrays (pLastLetter [], length, str) donde str es de tipo char * y no const char *? El compilador no muestra una advertencia, pero ¿puede causar un comportamiento indefinido? gracias –

+2

@Asher: 'const T *' es solo una promesa de no modificar la punta a través de ese puntero, por lo que puede convertir implícitamente una 'T *' en 'const T *' bien. (Sin embargo, esto no funciona para los punteros a los indicadores. Consulte http://c-faq.com/ansi/constmismatch.html.) – jamesdlin

5

str is const, pLastLetter is not. Está diciendo que el calificador const se descarta si haces esto.

+0

¡Gracias! Me preguntaba qué descartadas decía que serían descartadas. – JohnK

Cuestiones relacionadas