2016-07-17 25 views
1

Java/C++ Entwickler hier. Versuchen, C zu lernen, aber ich bin verwirrt mit Speicherzuweisung für Arrays.C - Array erlaubt außerhalb der Grenzen?

Was passiert hier?

#include <stdlib.h> 
#include <stdio.h> 
#include <windows.h> 

int main() 
{ 
    int az[3]; 
    az[2] = 66; 
    az[8] = 5214; 

    printf("%d\n", az[8]); 

    system("pause"); 
    return 0; 
} 

Ausgabe

5214 

Wie kann das sein? Warum bekomme ich keine Out of Bounds Ausnahme oder einen Programmabsturz? Kann ich das unendlich machen? Wie groß ist die Länge meines Arrays in diesem Fall? Was ist der Sinn des Zuweisens von Speicher über malloc, wenn meine Arrays es mir erlauben, bereits Werte außerhalb der Grenzen zu setzen? Das macht für mich keinen Sinn.

enter image description here

+0

C beschwert sich nicht außerhalb der Grenzen. So einfach ist das. – icbytes

+1

Verhalten ist 'undefiniert', was genau das bedeutet. Könnte abstürzen. Könnte Müll drucken. Könnte sigsegv. Könnte eine Kopie von Minecraft starten. C/C++ hat keine Leitplanken. – evaitl

+1

FYI Sie können das gleiche in C++ tun; es ist nicht einzigartig für C oder malloc. – qexyn

Antwort

4

C führt keine Überprüfung Grenzen. Das Indizieren eines Arrays der Länge 3 mit dem Index 8 funktioniert (scheinbar) problemlos, kann den von Ihrem Programm verwendeten Speicher geringfügig beschädigen oder einen sofortigen Segmentierungsfehler verursachen, je nachdem, wie das betreffende Array im Speicher angeordnet ist.

Dieser Fehlertyp kann als "Pufferüberlauf" bezeichnet werden und ist eine häufige Ursache für Sicherheitslücken. Wenn Sie die Grenzen eines Arrays vor der Indizierung nicht überprüfen, kann dies zur Laufzeit zu böswilligen Änderungen des Programms führen.

Willkommen in der verrückten und aufregenden Welt der C-Codierung!

Verwandte Themen