Wo werden die Größen des reservten Stackspeichers gespeichert?
-
Hi,
ich hab mal ne kleine Frage.
Wenn ich mit malloc Speicher auf dem Steak reserviere, wo wird dann gespeichert wie groß der Speicher ist (free muss das ja wissen)?
Wenn diese Information auch auf dem Stack gespeichert wird, könnte ich ja mittels Zeigerarithmetik mich da ausversehen durchfräßen
Ne, im Ernst. Würde mich echt interessierenGrüße Rapha
-
1.) Mit malloc reserviert man keinen Speicher auf dem Stack (für sowas gibts alloca)
2.) Das Betriebsystem verwaltet die Speicherzuweisungen für die einzelnen Prozesse.
-
bin ein bissl übermüdet
Klar, malloc speichert aufm heap und alloca aufm steakDas der Speicher vom Bs verwaltet wird, hätte ich zu allerletzt erwartet, da auch zb. der Instruction und Basepointer immer aufm Stack zwischengespeichert wird. Aber vielleicht denk ich zu konservativ :p
Beim Heap nehm ich an, liegt die Speicherverwaltung auch beim Bs.
Vielen Dank für deine Antwort
Grüße Rapha
-
Achja, und gleich noch ne Frage:
Wenn ich free nicht auf die ursprünglich erhaltene Speicheradresse aufrufe (sondern z.B. ein paar Bytes darüber), wird dann trotzdem der gesammte Speicher freigegeben?Hab grad keine Lust mitm Debugger rumzuspielen :p
Grüße Rapha
-
Bei den meisten Implementationen wird es dann wahrscheinlich abstürzen.
-
aufm steak kann man auch allokieren?
das fehlte noch, das computer auch noch bse kriegen können
-
Rapha schrieb:
Das der Speicher vom Bs verwaltet wird, hätte ich zu allerletzt erwartet
Ist ja auch nicht so. Das ist jetzt zwar keine reine ANSI-C Fragestellung, sondern von der Implementation abhängig, aber in der Regel ist die Speicherverwaltung zweistufig. Das OS teilt dem Programm anfangs einen großen Datenbereich zu. malloc arbeitet dann zunächst da drin und gibt immer irgendwelche Blöcke daraus zurück. Zwischen den Blöcken wird dabei Verwaltungsinformation gespeichert, z.b. wie lang ein Block ist, oder ob er frei oder belegt ist. Sollte dieser Datenbereich mal voll sein, wird vom OS ein weiterer großer Block angefordert oder der bisherige vergrößert. Jeden einzelnen malloc-Aufruf direkt ans OS weiterzuleiten wär ziemlicher Wahnsinn