pointer auf lokale variable
-
Hallo

Frage,ist der Zeiger so verwendet Ok? Oder ist da ein fehler im code (bin grade im kapitel über Zeiger und bin mir hier nicht sicher)?
struct Int { int wert; }; void GetInt(Int *i) { Int iTemp; iTemp.wert = 5; *i = iTemp; } void main() { Int i; GetInt(&i); }
-
Ist richtig. Du könntest allerdings auch
void GetInt(Int *i) { i->wert = 5; }schreiben. Das ist etwas kürzer und macht das gleiche.
-
In Bezug auf den Pointer sehe ich so keinen Fahler, aber void main ist falsch (d.h. nicht standardkonform, wenn dein Compiler es vielleicht auch zulässt), es muss int main sein.
-
Also das mit main wusste ich noch nicht, dann benutze ich jetzt int main

Was ich noch nicht verstehe ist das mit lokalen Variablen und Zeigern... Warum ist es hier Ok dass ich eine lokale an einen Zeiger zuweise? Normalerweise ist das doch verboten dachte ich??
-
Du weist dem Zeiger nichts zu, sondern dem Objekt, auf das der Zeiger zeigt.
*i ist das Objekt, i der Zeiger.
-
sebi707 schrieb:
Ist richtig. Du könntest allerdings auch
void GetInt(Int *i) { i->wert = 5; }schreiben. Das ist etwas kürzer und macht das gleiche.
In diesem Fall ist der Effekt der gleiche und dennoch ist es nicht das gleiche. Sobald ich die Struktur verändere, muss ich möglicherweise die Funktion auch anpacken. Daher ist Dein Vorschlag die deutlich schlechtere Variante.
-
Ok danke ich glaub jetzt hab ichs verstanden

-
Zeiger schrieb:
Was ich noch nicht verstehe ist das mit lokalen Variablen und Zeigern... Warum ist es hier Ok dass ich eine lokale an einen Zeiger zuweise? Normalerweise ist das doch verboten dachte ich??
i Zeigt auf ein Objekt außerhalb der Funktion. (das Objekt kommt von der rufenden Funktion)
Was du meinst ist:
Int *GetInt(void) { Int iTemp; // lokale Variable iTemp.wert = 5; return &iTemp // nicht nachmachen }Hier wird die Adresse einer lokalen Variable zurück gegeben.
Diese Variable verliert aber beim Beenden der Funktio ihre Gültigkeit.
-
tntnet schrieb:
Sobald ich die Struktur verändere, muss ich möglicherweise die Funktion auch anpacken. Daher ist Dein Vorschlag die deutlich schlechtere Variante.
Und bei dem ursprünglichen Code jetzt nicht oder was? Zugegeben es ist nicht genau das gleiche weil beim ursprünglichen Code ein lokales Objekt angelegt wird und dieses dann kopiert, aber meistens will man ja sowieso unnötige kopieren vermeiden.