Hallo,
ihr könntet mir bei einer Verständnis frage behilflich sein.
In einer Funktion Erschaffe ich eine Variable und Instantiiere sie mit einem Wert : int a = 42;
Aus der Funktion gebe ich die Adresse der variable: return &a;
Ein Pointer nimmt diese Adresse auf : int *iptr =0;
iptr = funktion();
Nun Dereferenziere ich den Pointer und gebe den Inhalt aus : cout << *iptr << endl;
Auf dem Bildschirm wird 42 ausgegeben. Die Variable wurde auf dem Stack abgelegt und nach dem verlassen der Funktion wird der Reservierte platz nun wider frei gegeben.
Und genau das ist mein Problem, meiner Meinung nach sollte das eine Speicherverletzung sein und auf dem Bildschirm könnte alles stehen, aber da steht 42.
Warum 42?
Stack wird nicht freigegeben nach beender der Funktion
Stack wird nicht freigegeben nach beender der Funktion
Wissen ist die einzige Ressource, die sich vermehrt wenn man sie teilt
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
Wo steht das, das die Stelle im Speicher ge-xxx-t werden muss. Natürlich ist das nicht mehr gültig und es kann undefiniertes Verhalten auftreten. Aber solange Du an diese Stelle (bzw. das Programm) nichts anderes schreibt, bleibt es halt bestehen.
Lass das Programm doch mal im release-Modus laufen. Stürzt es dann ab?
C.
Lass das Programm doch mal im release-Modus laufen. Stürzt es dann ab?
C.
Nein Abstürzen tut es nicht, und rufe ich die Variable gleich nach der Funktion auf ist ihr wert = 42.
Spaßeshalber habe ich mal eine schleife zwischen Funktion und der Ausgabe gesetzt.
Was den Wert Variieren lässt.
P.s. Danke Für die Antwort
Code: Alles auswählen
int main(int argc, char *argv[])
{
int *iptr =0;
iptr = funk();
cout << "Der wert von iptr " << iptr << " Dereferenziert : " << *iptr << endl;
return 0;
}Was den Wert Variieren lässt.
P.s. Danke Für die Antwort
Wissen ist die einzige Ressource, die sich vermehrt wenn man sie teilt
Aber ich hoffe du hasst das "System" verstanden ?Nein Abstürzen tut es nicht
Das Dein Zeiger immer noch auf die alte speichersstelle zeigt, und das da immer noch 42 drinnsteht, iss maximal "wahrscheinlich", Deshalb wird es als undefiniert bezeichnet. Undefiniertes verhalten iss so ziemlich das schlimmste was haben kannst bei der Programmierung.
Wenn der zeiger mal auf ne gueltige Speicherstelle gezeigt hat, und du interpretierst den wert spaeter irgendwann mal als int, wird das programm kaum abstuerzen, weil egal was da steht, er wird immer irgend nen int draus machen koennen. Aber welcher und in welchen zusammenhang das ist undefiniert fuer dich ....
erst wenn du auf die stelle schreibst(also dem dereferenzierten int was anderes zuweisst), kann richtig boeses passieren. mit viel "Glueck" uebverschreibst ne ruecksprungadresse von ner funktion ... oder was aehnlich sensibles. Und voila, irgendwas stuerzt dein programm unverhofft ab, an ner stelle wo es sicher ned vermutest
Und voila, die lustige fehlersuche kann beginnen.
Ich hoffe dann hasst immer noch Spass an solchen sachen
Ciao ...