2013-02-21 17 views
6

kiedy używać tablicy char indeks, jak w poniższym przykładzie:Char tablica indeks ostrzeżenie

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

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

    return 0; 
} 

ja dostaję ostrzeżenie, że używam char array indeks:

ostrzeżenie: tablica indeks ma typ ' char '[-Wchar-subscripts]

Co jest OK, ponieważ mam włączone to ostrzeżenie.

GCC instrukcja mówi:

-Wchar-indeksy Informuj jeżeli indeks tablicy ma typ "char". Jest to częsta przyczyna błędu, ponieważ programiści często zapominają, że ten typ jest podpisany na niektórych komputerach . To ostrzeżenie jest włączone przez opcję -Wall.

Tak więc to ostrzeżenie powinno zapobiegać użyciu ujemnego indeksu tablicowego. Moje pytanie brzmi, dlaczego to ostrzeżenie jest aktywne tylko w char, a nie w innych podpisanych typach?

Dziękuję.

+0

Zauważ, że powinieneś używać 'size_t' dla elementów tablicy, a nie' char'. – netcoder

Odpowiedz

8

Dzieje się tak, ponieważ int jest zawsze podpisany.

char nie musi.

char może być podpisany lub niepodpisany, w zależności od implementacji. (Istnieją trzy różne rodzaje - char, signed char, unsigned char)

Ale w czym problem? Mogę po prostu użyć wartości od 0 do 127. Czy to może mnie skrzywdzić po cichu?

Och, tak, może.

//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 Widzę to teraz. Dziękuję za claryfiing. Dobra wskazówka do indeksowania w cyklach. Dzięki. – Mihalko

+0

@Mihhalko cóż, to nie jest wskazówka, to ostrzeżenie;) – milleniumbug

+1

Problem polega na tym, że porównujesz znak "worm" w pętli. Indeksowanie tablic jest zupełnie nieistotne. Dlaczego więc ostrzegać o indeksie? Powinno to być ostrzeżenie przed porównaniem, które może być zawsze prawdziwe na niektórych maszynach ... –

2

Najwyraźniej narzeka, że ​​Twój indeks jest typu character.

Po prostu przekonwertuj pos na int, a ostrzeżenie zniknie.

Co do tego, dlaczego pojawia się to ostrzeżenie, sam je zgłosiłeś. Typ danych char może adresować tylko wartości od 0 do 255 (jeśli nie podpisano), a nawet tylko 127 (jeśli jest podpisany). W przypadku normalnej tablicy jest to raczej skromna liczba i można szybko zapomnieć o bitach signed i przypadkowo uzyskać dostęp do tablicy -128 (przez rzeczywisty dostęp do elementu tablicy 128).

Dopóki twoja macierz jest mniejsza niż 127, będziesz w porządku i możesz zignorować ostrzeżenie, ale bądźmy szczerzy ... te trzy dodatkowe bajty w śladzie pamięci nie sprawią, że twoja aplikacja będzie nieefektywna, to?

+0

Tak, wiem, dlaczego jest tam ostrzeżenie, ale zastanawiałem się, dlaczego tylko skargi GCC typu typ char. W każdym razie odpowiedź mileniumbuga była jasna. – Mihalko

0

Bo rodzimy char może być niepodpisany lub podpisany.

Należy pamiętać, że korzystanie z negatywnego indeksu dolnośląskiego jest całkowicie zgodne z prawem.Na przykład:

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

Teraz mogę używać ptr[-1] co odpowiada arr[4]. Jeśli char stanie się niepodpisane w implementacji, nigdy nie może być wartością ujemną.