2016-04-05 11 views
-5

Ich würde gerne wissen, warum dies auftritt. Ich erstelle ein 5-Elemente-Array mit ganzen Zahlen - jedes Element benötigt 4 Bytes im Speicher. Warum bekomme ich beim Drucken der Adresse von myArray [-1] auch eine gültige Adresse?Speicher von Arrays verwendet

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

int main() 
{ 
    int myArray[] = {1, 2, 3, 4, 5}; 

    printf("0x%p\n0x%p\n0x%p\n", &myArray[-1], &myArray[0], &myArray[1]); 

    return 0; 
} 

Ausgang: 0x0028FEF8 0x0028FEFC 0x0028FF00

+4

Ich stimme zu, diese Frage als off-topic zu schließen, weil "UB erklären" –

Antwort

2

Da nicht definiertes Verhalten nicht definiert ist: es funktioniert oder nicht, werden Sie nicht einen Segmentation Fault bekommen garantiert.

2

Die Adresse ist nicht gültig; es entspricht keinem Objekt in Ihrem Programm. Der Versuch, auf diesen Speicherort zuzugreifen, führt dazu, dass undefiniertes Verhalten - es kann einen Laufzeitfehler verursachen. Oder nicht.

Bei fast jeder Implementierung wird Ihr Array in einem größeren Speicherbereich materialisiert, also gibt es natürlich Speicherzellen auf beiden Seiten dieses Arrays (außer es beginnt bei Adresse 0, die es bei fast keinem gibt Implementierung, an der Sie tatsächlich arbeiten werden). Da C bei Array-Zugriffen keine Arten von Grenzen erzwingt, löst es nicht sofort eine Ausnahme aus, wenn Sie den Index -1 verwenden. Ja, Sie erhalten etwas, das wie ein vernünftiger Adresswert aussieht, aber wenn Sie versuchen, zu verwenden, kann dieser Speicherort zu einer Art von Chaos führen, je nachdem, was dort gespeichert ist (z. B. ein Rahmenzeiger). Die Sprachdefinition lässt das Verhalten undefiniert; Es stellt keine Anforderung an den Compiler, die Situation in irgendeiner Weise zu behandeln. Der Compiler kann eine Diagnose ausgeben, dass Sie etwas Dummes tun und die Übersetzung stoppen. Es Mai kompilieren Sie den Code ohne Beschwerde, und Sie werden nicht wissen, nichts ist falsch, bis Sie einen Laufzeitfehler erhalten. Es kann alles dazwischen tun.

Verwandte Themen