Eleu Geschrieben 15. Oktober 2011 Teilen Geschrieben 15. Oktober 2011 Hallo, ich habe noch mal ein paar Fragen zu Ansi C und dem Zuweisen von Zeichen oder Strings in char - Variablen Ich kann folgendes machen: ------------------------------------------ char myString[1024]; strcpy(myString,"Hallo"); printf(myString); ------------------------------------------------------ In ein char Array mit 1024 freien Zeichen wird der String "Hallo" kopiert. D.h die Zeichen stehen wie folgt in jedem Byte: myString[0] = 'H'; myString[1] = 'a'; myString[2] = 'l'; myString[3] = 'l'; myString[4] = 'o'; myString[5] = '\0'; alternativ geht auch ---------------------------------------------------------------- char *myString = "Hallo"; printf(myString); ----------------------------------------------- In dem Speicherbereich, auf der die Zeigervariable myString zeigt, wird der String "Hallo" gespeichert. Ich verstehe es so, das irgendwo 5 Byte im Speicher belegt werden. Würde ich myString nicht direkt den String "Hallo" übergeben, würde printf die Speicheradresse ausgeben und nicht den String "Hallo" Aber geht das hier auch ? --------------------------------------------- char myString[] = "Hallo"; printf(myString); --------------------------------------------------- Und wenn ja, wie muss man das verstehen ? Weil das hier denke ich, geht nicht, weil man würde versuchen 5 Zeichen auf 1 Byte abzuspeichern: ------------------------- char myString[5] = "Hallo"; --------------------------- Gruß Eleu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 15. Oktober 2011 Teilen Geschrieben 15. Oktober 2011 In dem Speicherbereich, auf der die Zeigervariable myString zeigt, wird der String "Hallo" gespeichert.Das trifft es nicht ganz. Der String "Hallo" steht im Speicher, und der Zeiger wird so initialisiert, dass er darauf zeigt. Ich verstehe es so, das irgendwo 5 Byte im Speicher belegt werden. Es sind 6 Bytes (die Nullterminierung nicht vergessen), und es ist auch nicht irgendwo, sondern ausdrücklich an einer Stelle im Speicher, auf die du nicht schreibend zugreifen darfst. Du kannst den String also nicht ändern. Würde ich myString nicht direkt den String "Hallo" übergeben, würde printf die Speicheradresse ausgeben und nicht den String "Hallo" Nein. Printf kann uninitialisierte Zeiger nicht erkennen. Es wird trotzdem versuchen, den Speicher, auf den der Zeiger zeigt, als String zu interpretieren. Da der Zeiger in aller Regel aber nicht auf eine gültige Speicheradresse verweisen wird, wird das in die Hose gehen. Aber geht das hier auch ? --------------------------------------------- char myString[] = "Hallo"; printf(myString); ---------------------------------------------------Sicher geht das. Und wenn ja, wie muss man das verstehen ? Weil das hier denke ich, geht nicht, weil man würde versuchen 5 Zeichen auf 1 Byte abzuspeichern:Wieso ein Byte? Wenn du bei der Definition eines Arrays die Größe nicht angibst, wird sie aus dem Ausdruck ermittelt, mit dem du das Arrray initialisierst. Das ist bei char-Arrays nicht anders. Da du hier ein Literal der Größe 6 für die Initialisierung benutzt, ist das Array 6 char groß. char myString[5] = "Hallo";Das geht nicht, das Array ist zu klein für das Literal. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 15. Oktober 2011 Autor Teilen Geschrieben 15. Oktober 2011 (bearbeitet) Wieso ein Byte? Wenn du bei der Definition eines Arrays die Größe nicht angibst, wird sie aus dem Ausdruck ermittelt, mit dem du das Arrray initialisierst. Das ist bei char-Arrays nicht anders. Da du hier ein Literal der Größe 6 für die Initialisierung benutzt, ist das Array 6 char groß. Das geht nicht, das Array ist zu klein für das Literal. Hallo, Danke für die Infos. D.h.: char myString[6] = "Hallo"; würde funktionieren. Aber nicht myString[6] = "Hallo"; Richtig ? ------------------------- Edit: Sicher geht das. Warum macht man das dann nicht immer so ? Dann muss ich /0 nicht mehr beachten. Bearbeitet 15. Oktober 2011 von Eleu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 15. Oktober 2011 Teilen Geschrieben 15. Oktober 2011 char myString[6] = "Hallo"; würde funktionieren. Aber nicht myString[6] = "Hallo"; Richtig? Ohne Angabe eines Types ist es Compiler abhängig was er daraus macht. Meisten, AFIAR, einen int. Warum macht man das dann nicht immer so ? Dann muss ich /0 nicht mehr beachten. Das ist ein String-Literal(?), sprich der Compiler setzt von sich aus ein "/0" daran, bzw. er weiß das das Teil nur 5 chars enthält. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Oktober 2011 Teilen Geschrieben 16. Oktober 2011 D.h.: char myString[6] = "Hallo"; würde funktionieren. Aber nicht myString[6] = "Hallo"; Richtig ?Das sind zwei völlig unterschiedliche Anweisungen. Das erste ist eine Definition eines Arrays der Größe 6 mit Initialisierung, das zweite ist eine Zuweisung an ein Array-Element. Ob das zweite geht, hängt davon ab, was myString in diesem Fall ist. Die eckigen Klammern stellen nur bei der Deklaration eine Größenangabe dar. Ansonsten wählst du damit ein Element aus. Warum macht man das dann nicht immer so ?Weil man ein char-Array nicht immer mit einem festen Text vorbelegen will. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 16. Oktober 2011 Teilen Geschrieben 16. Oktober 2011 Argh! Warum übersehe ich sowas immer! Damn! :beagolisc Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 4. November 2011 Autor Teilen Geschrieben 4. November 2011 Hallo, noch eine Frage zu den Char - Variablen. char *Variable = NULL; Hier wäre "Variable" eine zu NULL initialisierte Pointervariable vom Datentyp Char. char* Variable = NULL; Was ist das ? Kann mir das jemand erklären. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. November 2011 Teilen Geschrieben 4. November 2011 Was ist das ?Dasselbe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 4. November 2011 Autor Teilen Geschrieben 4. November 2011 Dasselbe. Warum gibt es für ein und das selbe eine unterschiedliche Syntax ? Weiß Du das vielleicht zufällig ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 4. November 2011 Teilen Geschrieben 4. November 2011 Das gleiche in anderer Schreibweise? Also auch vergleichbar mit char * Variable = NULL; Derjenige, der C++ gewohnt ist benutzt letztere und der C-Programmierer erstere Schreibweise. Genaugenommen handelt es sich nicht um eine Pointervariable vom Typ char sondern um eine Variable vom Typ Pointer auf char. Der Typ ist char*. Aber das nur für's Protokoll Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. November 2011 Teilen Geschrieben 4. November 2011 Warum gibt es für ein und das selbe eine unterschiedliche Syntax ?Die Syntax ist dieselbe, das Leerzeichen ist weder vor noch nach dem Stern notwendig. Whitespace (Leerzeichen, Tabs, Zeilenumbrüche) ist weitestgehend bedeutungslos. Ausnahmen sind Präprozessordirektiven, Literale, und wenn durch Weglassen von Whitespace andere Schlüsselwörter gebildet werden. Ob du also deine Zeile so schreibst char*Variable=NULL; oder so char * Variable = NULL ;[/code] ist egal, das Ergebnis bleibt dasselbe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.