2013-02-21 18 views
6

quando uso char indice di matrice come in questo esempio:Char serie pedice avvertimento

int main(){ 
    char pos=0; 
    int array[100]={}; 

    for(pos=0;pos<100;pos++) 
     printf("%i\n", array[pos]); 

    return 0; 
} 

sto ottenendo avverte che sto usando char array di pedice:

avvertimento: indice di matrice è di tipo ' char '[-Wchar-subscripts]

Quale è OK, perché ho questo avviso abilitato.

manuale GCC dice:

-Wchar-indici Avvisa se un indice di matrice è di tipo "char". Questa è una causa comune di errore, poiché i programmatori spesso dimenticano che questo tipo è firmato su alcune macchine . Questo avviso è abilitato da -Wall.

Quindi questo avviso dovrebbe impedire l'utilizzo dell'indice di array negativo. La mia domanda è: perché questo avviso è attivo solo su char e non anche su altri tipi firmati?

Grazie.

+0

Si noti che si dovrebbe usare 'size_t' per gli elementi dell'array, non' char'. – netcoder

risposta

8

Questo perché int è sempre firmato.

char non è necessario.

char può essere firmato o non firmato, a seconda dell'implementazione. (Ci sono tre tipi distinti - char, signed char, unsigned char)

Ma qual è il problema? Posso usare solo valori da 0 a 127. Questo può ferirmi in silenzio?

Oh, sì, può.

//depending on signedess of char, this will 
//either be correct loop, 
//or loop infinitely and write all over the memory 
char an_array[50+1]; 
for(char i = 50; i >= 0; i--) 
{ 
    an_array[i] = i; 
    // if char is unsigned, the i variable can be never < 0 
    // and this will loop infinitely 
} 
+0

Ah, lo vedo ora. Grazie per il claryfiing. Bel suggerimento per l'indicizzazione in cicli. Grazie. – Mihalko

+0

@Mihalko bene, non è un suggerimento, è un avvertimento;) – milleniumbug

+1

Il problema qui è che stai confrontando un char wuth '> = 0' nel ciclo. L'indicizzazione degli array è completamente irrilevante. Quindi perché dare un avvertimento sull'indice? Dovrebbe essere un avvertimento sul confronto, che potrebbe essere sempre vero su alcune macchine ... –

2

In parole povere, si lamenta che il proprio indice sia di tipo character.

Basta convertire pos in un int e l'avviso scompare.

Per quanto riguarda il motivo per cui viene visualizzato questo avviso, l'hai dichiarato tu stesso. Un tipo di dati char può indirizzare solo valori compresi tra 0 e 255 (se non firmati) o anche solo 127 (se firmati). Per un array normale, si tratta di un numero piuttosto esiguo e si potrebbe rapidamente dimenticare il signed bit e accidentalmente accedere alla posizione dell'array -128 (effettivamente accedendo all'elemento 128 dell'array).

Finché l'array è più piccolo di 127, starai bene e puoi ignorare l'avviso, ma siamo onesti ... questi tre byte in più nella memoria non renderanno la tua applicazione inefficiente, vero?

+0

Sì, lo so perché è l'avviso lì, ma mi chiedevo perché GCC ha solo lamentele per tipo char. Ad ogni modo, come la risposta di mileniumbug ha chiarito. – Mihalko

0

Perché nativo char può essere o non firmati o firmati.

Si noti che è perfettamente legale utilizzare l'indice negativo.Per esempio:

int arr[10]; 
int *ptr = arr[5]; 

ora posso usare ptr[-1] che è equivalente a arr[4]. Se char sembra non essere firmato nell'implementazione, non può mai essere un valore negativo.