C - prüfen ob Speicher leer

#2196763
Lesenswert?

Hallo,

wie kann ich prüfen ob ein Speicherbereich auf den ein Pointer zeigt 
leer ist??
In meinem Programm habe ich folgenden Ausdruck:

meinestrukt->inhalt....

wenn nun "inhalt" schon freigegeben wurde - also der speicher an dieser 
Stelle leer ist - bekomme ich einene heap-fehler - wie kann ich das 
abfragen (da ja if(meinestrukt->inhalt ==NULL) oder etwas ähnliches 
nicht geht - da ja bei einer solchen Abfrage auch schon ein Zugriff auf 
den nicht vorhandenen Speicher erfolgt - was wieder zu einem Fehler 
führt)

das sollte doch eig. kein hexenwerk sein...

danke
Gast #2196766
Lesenswert?

Wenn ich die Frage richtig verstanden habe lautet die Antwort: Es gibt 
keine Möglichkeit.

Es obliegt allein dem Programmierer sicherzustellen dass nur auf zuvor 
reservierte Speicherbereiche zugegriffen wird!

Hack: Für dynamisch allokierten Speicher nach jedem free() dem Pointer 
NULL zuweisen, dann kann man if(...==NULL) nutzen. Eigentlich taugt das 
aber nur zum Debuggen, den im fertigen Programm sollten solche Abfragen 
eigentlich NICHT nötig sein.


Gehts darum einen konkreten Fehler zu finden?
Gast #2196767
Lesenswert?

max .. schrieb:
> wenn nun "inhalt" schon freigegeben wurde - also der speicher an dieser
> Stelle leer ist - bekomme ich einene heap-fehler - wie kann ich das
> abfragen (da ja if(meinestrukt->inhalt ==NULL) oder etwas ähnliches
> nicht geht - da ja bei einer solchen Abfrage auch schon ein Zugriff auf
> den nicht vorhandenen Speicher erfolgt - was wieder zu einem Fehler
> führt)
>
> das sollte doch eig. kein hexenwerk sein..

doch ist es. Speicher kann nicht leer sein.

du kannst nur nach dem Freigeben den Zeiger auf NULL setzen. Dann kannst 
du es auch Prüfen, anders geht es nicht.
#2196770
Lesenswert?

meinestrukt->inhalt kannst du sehr wohl auf NULL prüfen, musst nur dafür 
sorgen, das das auch bei der Speicherfreigabe passiert, d.h. du musst 
nach der Speicherfreigabe meinestrukt->inhalt auf NULL setzen:
1
 free(meinestrukt->inhalt);
2
 meinestrukt->inhalt = NULL;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren