Warum können wir in C außerhalb der Grenzen schreiben?

Ich habe kürzlich das Lesen des virtuellen Speichers beendet und habe eine Frage zur Funktionsweise von malloc im virtuellen Adressraum und im physischen Speicher.

Zum Beispiel (Code aus einem anderen SO-Beitrag kopiert)

void main(){
int *p;
p=malloc(sizeof(int));
p[500]=999999;
printf("p[0]=%d\n",p[500]); //works just fine. 
}

Warum darf das passieren? Oder warum ist diese Adresse bei p [500] überhaupt beschreibbar?

Hier ist meine Vermutung.

Wenn malloc aufgerufen wird, entscheidet das Betriebssystem möglicherweise, dem Prozess eine ganze Seite zu geben. Ich gehe einfach davon aus, dass jede Seite 4 KB Platz wert ist. Ist das Ganze als beschreibbar gekennzeichnet? Aus diesem Grund können Sie bis zu 500 * sizeof (int) in die Seite einsteigen (vorausgesetzt, das 32-Bit-System hat eine Größe von 4 Byte für int).

Ich sehe das, wenn ich versuche, mit einem größeren Wert zu bearbeiten ...

   p[500000]=999999; // EXC_BAD_ACCESS according to XCode

Seg Fehler.

Wenn dies der Fall ist, bedeutet dies, dass es Seiten gibt, die Ihrem Code / Anweisungen / Textsegmenten gewidmet sind und als nicht beschreibbar gekennzeichnet sind, und dass sie vollständig von Ihren Seiten getrennt sind, auf denen sich Ihre Stapel / Variablen befinden (wo sich die Dinge ändern) und als gekennzeichnet sind schreibbar? Natürlich denkt der Prozess, dass sie neben jeder Bestellung im 4-GB-Adressraum eines 32-Bit-Systems stehen.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage