Nein, der Code sollte nicht (unbedingt) einen segfault ergeben. Ein Segmentfehler tritt auf, wenn Sie versuchen, auf eine virtuelle Speicherseite zuzugreifen, die Ihrem Prozess nicht zugeordnet ist.
Der "Heap" oder "Free Store" ist eine Region von virtuellen Speicherseiten, die Ihrem Prozess gehören. Die malloc()
-API unterteilt diese Region in Blöcke und gibt einen Zeiger auf den Block zurück.
Wenn Sie nach dem Ende des Blocks adressieren, auf den Sie einen Zeiger haben, greifen Sie normalerweise auf den Speicher zu, der Teil des Heapspeichers ist, aber nicht Teil Ihres zugewiesenen Blocks. Auf diese Weise können Sie andere Heap-Blöcke oder sogar die Datenstrukturen korrumpieren, die malloc()
verwendet, um den Heap zu definieren.
Weitere Informationen über Heapbeschädigung und Methoden in der Debug-Version des Codes zu erkennen, das ist ein großes Buch:
Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs by Steve Maguire alt text http://ecx.images-amazon.com/images/I/5148TK6JCVL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Ein Nachtrag zum pedantisch: In seltenen Fällen Durch Zugriff auf Speicher über das Ende eines Heap-Blocks hinaus können Sie auf Speicher zugreifen, der nicht Teil des Heapspeichers ist. In diesen Fällen erhalten Sie möglicherweise den von Ihnen erwarteten Segmentierungsfehler. Sie könnten auch eine andere Datenstruktur als den Heap beschädigen. Es ist wirklich eine Frage des Zufalls. Der Heap selbst ist jedoch im Vergleich zu typischen Heap-Blöcken sehr groß, so dass 99% des Timecodes wie Ihr Beispiel den Heap verfälschen. Das Beispiel, das Sie angeben, fällt in diesen 99% -Fall.
Wahrscheinlich nur Glück gehabt. –
Du hast eine 5 an einen Ort geschrieben, der dir nicht gehört hat. Wenn der Besitzer dieses Ortes nicht mochte, was Sie zu seinem Haus getan haben, wird es seine Rache bekommen. ** Vorsicht **, es könnte zu Ihrem USB-Festplattentreiber gehören und formatiert das nächste Laufwerk, das Sie einlegen. – pmg
@pmg: Realistisch gesehen ist das bei einem modernen Protected-Mode-Betriebssystem nicht sehr wahrscheinlich. – bcat