sayso Geschrieben 30. Oktober 2005 Autor Geschrieben 30. Oktober 2005 Hallo, also erstmal danke für eure Geduld mit mir :hells: Ich habe wirklich schon mit Zeigern gearbeitet mich jedoch nur mit integer und long zeigern und da habe ich mir ehrlich gesagt keine Mühe gemacht über die Speicherallokierung gedanken gemacht. Zum Thema Literal: Wenn ich den Code übersetze und einen strings auf das Programm mache und dann den Text sehe ist das ein Literal richtig? Zum Thema "char *variable." Mit dem Papier und Bleistift Beispiel ist dies jetzt auch klar: char *test = "Testmessage \n"; printf("%s",test); test = "muhh \n"; printf("%s",test); Bei diesem Beispiel schreibe ich radiere ich die alte Adresse ja weg und schreibe eine neue auf den Zettel. D.h. aber die beiden Häuser "Testmessage " und "muhh" müssen zur Laufzeit schon bestehen - Richtig? D.h. das Programm allokiert den Speicher für die beiden Nachrichten beim starten bzw. beim wechseln in die Funktion automatisch? Das mit malloc habe ich jetzt verstanden Das mit den Beispielprogramm und den Adressen der zeigern *autsch* ist auch logisch Und jetzt meine letzte Frage: Der Code ist nicht vollständig aber die IP des Hostes bekomme ich automatisch von anderen Funktionen d.h. er kann sich ändern. Das Programm läuft in einer Schleife. Meine Frage: Kann es hier jetzt zu undefinierten Verhalten kommen? Ich meine nicht denn ich biege den Zeiger ja nur auf die "neue IP" um. Aber wohin schreibt das Programm dann den Output der Funktion "inet_ntoa(cli.sin_addr))" - ja irgendwo in den Speicher... aber es räumt ihn ja nicht weg, solange das Programm nicht verlassen wird oder - denn main ist ja "die Hauptfunktion"? d.h. es ist eigentl. ein Speicherfresser? ausgabe(char *message) { printf ("hostname: %s", message); } void main() { char *host= ""; // hier ist normalerweise ein code mit schleife host= inet_ntoa(cli.sin_addr)); // hier wird die IP lesbar gemacht ausgabe(host); // hier ist normalerweise ein code mit schleife } Danke Zitieren
Klotzkopp Geschrieben 30. Oktober 2005 Geschrieben 30. Oktober 2005 Wenn ich den Code übersetze und einen strings auf das Programm mache und dann den Text sehe ist das ein Literal richtig?Nein, nicht nur Literale (also Konstanten im Quellcode) landen als Strings in der ausführbaren Datei. Auch Importsymbole und Debugginginformationen können da stehen. D.h. aber die beiden Häuser "Testmessage " und "muhh" müssen zur Laufzeit schon bestehen - Richtig? D.h. das Programm allokiert den Speicher für die beiden Nachrichten beim starten bzw. beim wechseln in die Funktion automatisch?Genau. Das ist es, was ich (schon mehrfach) mit statischer Lebensdauer meinte. Literale sind - solange dein Programm läuft - immer da, du brauchst dich um nichts zu kümmern. Aber wohin schreibt das Programm dann den Output der Funktion "inet_ntoa(cli.sin_addr))" - ja irgendwo in den Speicher... aber es räumt ihn ja nicht weg, solange das Programm nicht verlassen wird oder - denn main ist ja "die Hauptfunktion"?Die Frage ist berechtigt. In solchen Fällen sollte die Antwort immer in der Dokumentation der Funktion stehen. Ich zitiere mal aus dem Eintrag in der MSDN Library für inet_ntoa: The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread—but no longer. Therefore, the data should be copied before another Windows Sockets call is made. Zitieren
sayso Geschrieben 30. Oktober 2005 Autor Geschrieben 30. Oktober 2005 Nein, nicht nur Literale (also Konstanten im Quellcode) landen als Strings in der ausführbaren Datei. Auch Importsymbole und Debugginginformationen können da stehen. Ok Genau. Das ist es, was ich (schon mehrfach) mit statischer Lebensdauer meinte. Literale sind - solange dein Programm läuft - immer da, du brauchst dich um nichts zu kümmern. Das war der Sprung der mir bisher immer gefehlt hat, ich dachte immer das er den Speicher erst immer dann allokiert wenn er an den Punkt des Codes kommt indem ein "neuer Text" benötigt wird. Aber wenn er ales von Anfang an macht, dann ist das mit den Zeiger auch zu 100% logisch. Die Frage ist berechtigt. In solchen Fällen sollte die Antwort immer in der Dokumentation der Funktion stehen. Ich zitiere mal aus dem Eintrag in der MSDN Library für inet_ntoa: Ok danke. Das oben ist ein Beispielcode und ich dachte die Funktion schreibt immer auf den Speicherbereich auf den der Zeiger zeigt (wie bei den Literalen). Das war für mich so nicht nachvollziehbar Aber wenn das die Winows-Socket function handelt ist ja alles gut Also nochma vielen Dank ein dicken :byby: :byby: an alle *g* Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.