Zum Inhalt springen

char, *char und char[]


sayso

Empfohlene Beiträge

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 :rolleyes: 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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...