Zum Inhalt springen

Frage zu char Variablen


Eleu

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  • 3 Wochen später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

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