Forum: Mikrocontroller und Digitale Elektronik realloc Speicheradresse


von Franz (Gast)


Lesenswert?

Hallo,

habe ein Problem mit realloc das ich nicht ganz verstehe, folgender 
Test:
1
uint8_t *ptest=NULL;
2
3
ptest=malloc(100);
4
ptest=realloc(ptest,50);

ich würde jetzt erwarten das sich die Speicheradresse von ptest nach 
realloc() nicht ändert da der neue Speicherbereich ja kleiner ist als 
der ursprüngliche...beim Vergrößern des Speicherbereiches könnte es 
passieren wenn der nachgelagerte Speicher nicht verfügbar ist aber beim 
verkleinern?

verwende einen LPC1227 mit LPCXpresso und der Redlib...

Bin etwas ratlos ;)

von Udo S. (urschmitt)


Lesenswert?

Die spec sagt zum Returnwert:
A pointer to the reallocated memory block, which may be either the same 
as ptr or a new location.

Es kommt nicht darauf an was du dir ausdenkst was sein könnte, sondern 
was IST.
Warum soll realloc nicht einen anderen Speicherbereich nehmen, so kann 
er den freien Speicher ggf. optimieren um größere zusammenhängende freie 
Blöcke zu schaffen.
Fakt ist du musst damit rechnen, daß der neue Speicherort ein anderer 
ist.

von Thomas F. (tomasf)


Lesenswert?

http://www.cplusplus.com/reference/cstdlib/realloc/

"The function may move the memory block to a new location (whose address 
is returned by the function)."

von Karl H. (kbuchegg)


Lesenswert?

> ich würde jetzt erwarten das sich die Speicheradresse von
> ptest nach realloc() nicht ändert da der neue Speicherbereich
> ja kleiner ist als der ursprüngliche

Ja, das könnte sein.

Könnte aber auch sein, dass derjenige, der dein realloc implementiert 
hat, sich die Sache einfach gemacht hat. Und das darf er.
Fakt ist, dass du keine Garantie dafür hast, dass die Adresse sich nicht 
ändert. Und damit ist das Verhalten legitim.

von Franz (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Warum soll realloc nicht einen anderen Speicherbereich nehmen, so kann
> er den freien Speicher ggf. optimieren um größere zusammenhängende freie
> Blöcke zu schaffen.

realloc() wird direkt nach malloc() ausgeführt also ändert sich 
Speichertechnisch doch nichts was er plötzlich optimieren könnte!?

Aber ok, dachte realloc() ist so intelligent, irgendwie uneffizient wenn 
er den Inhalt dann umkopiert obwohl er nicht müsste....

Danke für die Antworten :)

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> dachte

Das ist dein Fehler. Du darfst nicht 'denken' wie eine 
Programmierschnittstelle funktionien könnte, sondern du musst dir die 
Spec anschauen.

Franz schrieb:
> realloc() wird direkt nach malloc() ausgeführt also ändert sich
> Speichertechnisch doch nichts was er plötzlich optimieren könnte!?

Warum?
Wenn du erst 1KByte allozierst dann hat dir alloc den ersten verfügbaren 
Block mit 1K gegeben, jetzt machst du ein realloc auf 500Bytes und die 
Speicherverwaltung findet irgendwo eine Lücke die kleiner als 1K aber 
größer als 500 Bytes ist und gibt dir diese.
So hat sie die 1K Lücke oder den größeren Block von dem der 1K-Block ein 
Teil war wieder frei.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
ptest=realloc(ptest,50);

Das sollte man übrigens nicht so machen. Kann nämlich realloc die 
Speicheranforderung nicht erfüllen, gibt es einen NULL-Pointer zurück, 
der ursprüngliche Speicher aber bleibt gültig:
1
If the function fails to allocate the requested block of memory, 
2
a null pointer is returned, and the memory block pointed to by 
3
argument ptr is not deallocated (it is still valid, and with its 
4
contents unchanged).

Wenn aber der auf diesen Speicher zeigende Pointer mit dem Rückgabewert 
von realloc überschrieben wird, ist der Speicher weg, sprich: 
verwaist.

Also: Den Rückgabewert von realloc nie dem Pointer zuweisen, der 
realloc übergeben wird.

von Franz (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Das ist dein Fehler. Du darfst nicht 'denken' wie eine
> Programmierschnittstelle funktionien könnte, sondern du musst dir die
> Spec anschauen.

Du hast natürlich recht aber als Techniker versucht man die Hintergründe 
zu verstehen, ist meist sicherer als wenn man dinge einfach hin nimmt :)

Aus der Spec hab ich das eben so verstanden das nur beim Vergrößern 
möglicherweise ein neuer Bereich zugewiesen wird... nach deiner Eklärung 
ist das Verhalten für mich jetzt verständlicher, danke!

Rufus Τ. Firefly schrieb:
> Das sollte man übrigens nicht so machen. Kann nämlich realloc die
> Speicheranforderung nicht erfüllen, gibt es einen NULL-Pointer zurück,
> der ursprüngliche Speicher aber bleibt gültig

War nur ein Testcode in der richtigen Implementierung ist das natürlich 
abgefangen ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.