Voller C-Style-String *MUSS* terminated by 0?

FireFlow

Erfahrenes Mitglied
Hab eine kleine Frage. Wenn ich nen String hab (also ein char-array keine string-klasse) MUSS er dann 'terminated by 0' wenn er voll ist? Ich möchte nur wissen ob das zu irgendwelchen Fehlern führen kann wenn er das nicht ist.

Beispiel:
Code:
char test[4];
char* pointer = test;

pointer = "ABCD"; // <= Geht das oder darf ich nur "ABC\0" ?

edit: Also dass dieses Beispiel geht ist schon klar, nur ich meine ob bestimmte Funktionen jetzt meine char-array nicht mehr lieb haben weil es nicht 'terminated by 0' ist.
 
Zuletzt bearbeitet:
moin


So wie du es geschrieben hast wirst du wohl keine Fehlermeldung vom Compiler bekommen, aber es wird ein Puffer Überlauf erzeugt, da "ABCD" ein konstanter String ist der mit 0 Terminiert ist.

Hier z.B.:
Code:
char test[4];

test[0]='A';
test[0]='B';
test[0]='C';
test[0]='D';

wird kein Pufferüberlauf erzeugt.
Du könntest allerdings bei Funktionen Probleme kriegen z.B. cout (ja ist keine "richtige" Funktion) oder printf(), denn die geben immer einen String soweit aus bis ein \0 kommt auch wenn es 1000 Zeichen zu weit ist.

Hoffe deine Frage ist ansatzweise beantwortet.


mfg
umbrasaxum
 
Ja habs begriffen ich übergebe an eine Funktion ja nur den Pointer von meinem Char Array und wenn ich keine terminierende Null am Ende habe schiebt er den Pointer immer weiter auch über den Speicherbereich von meinem Array heraus.
Mit anderen Worten: Die Nulle muss hin :) - Es kann doch so einfach sein
 
So wie du es geschrieben hast wirst du wohl keine Fehlermeldung vom Compiler bekommen, aber es wird ein Puffer Überlauf erzeugt, da "ABCD" ein konstanter String ist der mit 0 Terminiert ist.

Das wird KEINEN Pufferuberlauf geben. Einfach keinen Fehler wird es geben.
Und "pointer" wird auch nicht mehr auf "test" zeigen, sondern auf den konstanden String "ABCD", der mit \0 terminiert ist.
Um einen Pufferuberlauf zu machen, muss man den String versuchen reinzukopieren,
strcpy(pointer, "ABCD");

so ;)
 
moin


Verdammt, du hast recht.
Ich meinte es auch nicht mit Pointer.

sondern so: char text[4]={"ABCD"};

Aber da wirst du nen Compilerfehler bekommen, aufjedenfall bei neueren Compilern.


mfg
umbrasaxum
 
Zurück