Zum Inhalt springen

char, *char und char[]


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.
Geschrieben
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*

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...