2011-12-09 11 views
6

mio compilatore (GCC) sta mostrando l'avvisoavvertimento: obiettivi puntatore in inizializzazione si differenziano per signedness

#include<stdio.h> 

struct s{ 
    unsigned char *p; 
}; 

int main() { 
    struct s a = {"??/??/????"}; //warning 
    printf("%s",a.p); 
    return 0; 
} 

avvertimento: obiettivi puntatore in inizializzazione si differenziano per signedness

ti prego, aiutami a perché è questo avvertimento viene .

+4

I valori letterali stringa non sono di tipo "carattere non firmato". –

+0

@SethCarnegie - Stavo per postare quella risposta come dopo aver modificato il suo post (che Mystical mi ha battuto) - fallo e invierò un voto a –

+0

@BrianRoach ok, grazie. –

risposta

16

I valori letterali stringa non sono di tipo unsigned char*.

Probabilmente intendevi digitare const char* nella tua struttura. In caso contrario, probabilmente non si desidera assegnare una stringa letterale ad essa senza renderla const, perché è illegale modificare la memoria in cui risiedono i valori letterali delle stringhe.

1

Cambiare il tipo di carattere senza segno * su const char *.

6

Come ha detto @Seth Carnegie, i valori letterali stringa sono di tipo char*, non unsigned char*. Quindi puoi evitare questo avviso con un cast di tipo esplicito. vale a dire

#include<stdio.h> 

struct s{ 
    unsigned char *p; 
}; 

int main() { 
    struct s a = {(unsigned char *)"?""?/?""?/????"}; // no warning 
    printf("%s",a.p); 
    return 0; 
} 

Edit: Cambiato stringa letterale per rimuovere i possibili trigraph

+3

'?? /' è il [trigraph] (http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C) per '\'. Ciò significa che la stringa uscirà per essere "" \\ ???? "", quindi con l'escape di ''\'' diventa '" \ ???? "'. Non so se i trigraph vengono sostituiti all'interno di string letterali, anche se tutto ciò potrebbe essere sbagliato. +1 per individuarlo. –

+2

Devi fare attenzione ai trigrafi, perché '" wtf ??! "' Si trasformerà in '" wtf | "'. È un vecchio costrutto di un'era passata di tastiere che mancavano certe chiavi. –

+0

@Chris quindi sono sostituiti all'interno di stringhe letterali? –

4

Ci possono essere alcuni casi in cui il cambiamento delle opzioni del compilatore dovrebbe essere un modo ragionevole per risolvere quello.

Un esempio:

Hai API con alcuni prototipi in questo modo:

void Display (unsigned char * Text); 

e si desidera chiamare in questo modo:

Display ("Some text"); 

È può ottenere lo stesso avvertimento ("i bersagli del puntatore nel passaggio dell'argomento 1 di" Display "differiscono nella significatività").

Questo avviso è dovuto bandiera -Wpointer-sign che, citando GNU riferimento compilatore, "... è implicito -Wall e -pedantic, che può essere disabilitato con -Wno-pointer-sign".

Problemi correlati