2010-02-23 19 views
31

Estoy tratando de imprimir la lista de una lista vinculada individualmente a la que me refería en link text. Funciona, pero sí tienen las advertencias del compilador:La inicialización descarta los calificadores del tipo de destino del puntero

Initialization discards qualifiers from pointer target type

(sobre la declaración de inicio = cabeza) y

return discards qualifiers from pointer target type

(en la instrucción de retorno) en este código:

/* Prints singly linked list and returns head pointer */ 
LIST *PrintList(const LIST *head) 
{ 
    LIST *start = head; 

    for (; start != NULL; start = start->next) 
     printf("%15s %d ea\n", head->str, head->count); 

    return head; 
} 

Estoy usando XCode. ¿Alguna idea?

Respuesta

65

Es esta parte es:

LIST *start = head; 

El parámetro de la función es un puntero a una constante, const LIST *head; esto significa que no puede cambiar a lo que apunta. Sin embargo, el puntero anterior es a no const; podrías desreferenciarlo y cambiarlo.

Tiene que ser así const:

const LIST *start = head; 

Lo mismo se aplica a su tipo de retorno.


Todo el compilador está diciendo es: "Hey, usted dijo a la persona que llama 'No voy a cambiar nada', pero que está abriendo oportunidades para eso."

+0

Pregunta tonta, pero lo que hace una mirada tipo de retorno como const? Intenté buscar en la web y parece que no puedo encontrar ninguna. – Crystal

+5

@Crystal - 'const LIST * PrintList (const LIST * head) {...}' –

+0

'El parámetro de la función es un puntero constante' - incorrecto. 'const LIST * head' declara head como un puntero a una LISTA constante. Ver: http://c-faq.com/decl/constparm.html - tal vez esto es solo un malentendido en la redacción. – CivFan

17

En función siguiente obtendrá la advertencia de que te encontraste con,

void test(const char *str) { 
    char *s = str; 
} 

hay 3 opciones:

  1. Retire el modificador const de param:

    void test(char *str) { 
        char *s = str; 
    } 
    
  2. Declara la variable de destino también como const:

    void test(const char *str) { 
        const char *s = str; 
    } 
    
  3. utilizar un tipo de conversión:

    void test(const char *str) { 
        char *s = (char *)str; 
    } 
    
Cuestiones relacionadas