2013-02-21 2 views
6

, wenn ich wie in diesem Beispiel char Array-Index verwenden:Char Array-Index Warnung

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

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

    return 0; 
} 

ich Warnung bin immer, dass ich char Array-Index bin mit:

Warnung: Array-Index hat Typ ' char '[-Wchar-Indizes]

Was ist OK, weil ich diese Warnung aktiviert habe.

GCC Handbuch sagt:

-Wchar-Indizes Warn , wenn ein Array-Index Typ "char" hat. Dies ist eine häufige Fehlerursache, da Programmierer oft vergessen, dass dieser Typ auf einigen Maschinen signiert ist. Diese Warnung wird von -Wall aktiviert.

Diese Warnung sollte also die Verwendung eines negativen Array-Index verhindern. Meine Frage ist, warum ist diese Warnung nur für char und nicht auch für andere signierte Typen aktiv?

Vielen Dank.

+0

Beachten Sie, dass Sie 'size_t' für Array-Elemente verwenden sollten, nicht' char'. – netcoder

Antwort

8

Dies ist, weil int immer signiert ist.

char muss nicht.

char kann je nach Implementierung signiert oder unsigniert sein. (Es gibt drei verschiedene Arten - char, signed char, unsigned char)

Aber was ist das Problem? Ich kann nur Werte von 0 bis 127 verwenden. Kann dies mich schweigend verletzen?

Oh, ja kann es.

//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, ich sehe es jetzt. Vielen Dank für Ihre Hilfe. Netter Tipp für die Indexierung in Zyklen. Vielen Dank. – Mihalko

+0

@Mihalko Nun, es ist kein Tipp, es ist eine Warnung;) – milleniumbug

+1

Das Problem hier ist, dass Sie ein Zeichen wuth '> = 0 'in der Schleife vergleichen. Die Array-Indizierung ist völlig irrelevant. Warum also vor dem Index warnen? Es sollte vor dem Vergleich gewarnt werden, was auf manchen Rechnern immer zutrifft ... –

2

Einfach ausgedrückt, es beschweren sich über Ihren Index vom Typ character.

Konvertieren Sie einfach pos in eine int und die Warnung wird verschwinden.

Warum diese Warnung angezeigt wird, haben Sie selbst angegeben. Ein char-Datentyp kann nur Werte von 0 - 255 (wenn vorzeichenlos) oder nur 127 (wenn signiert) adressieren. Für ein normales Array ist das eine eher magere Zahl und Sie könnten schnell das signed-Bit vergessen und versehentlich auf Array-Position-128 zugreifen (indem Sie tatsächlich auf das Array-Element 128 zugreifen).

Solange Ihr Array kleiner als 127 ist, werden Sie in Ordnung sein und Sie können die Warnung ignorieren, aber seien wir ehrlich ... diese drei zusätzlichen Bytes in Ihrem Speicherbedarf werden Ihre Anwendung nicht ineffizient machen es?

+0

Ja ich weiß warum ist die Warnung da, aber ich habe mich gefragt, warum GCC nur Beschwerden für Typ char. Wie Mileniumbugs Antwort auch immer klarstellte. – Mihalko

0

Da nativen char entweder unsigned oder signiert werden kann.

Beachten Sie, dass es legal ist, einen negativen Index zu verwenden.Zum Beispiel:

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

Jetzt kann ich ptr[-1] verwenden, die arr[4] entspricht. Wenn char zufällig in der Implementierung nicht signiert ist, kann es niemals ein negativer Wert sein.