char* - Wann MALLOC notwendig
-
Hallo!
Wenn ich ein char* deklariere, die Zuweisung
einer Zeichenkette aber erst später erfolgt,
ist dann trotzdem ein MALLOC notwendig, oder
wird die Feldgrösse nach der Zuweisung fest-
gelegt?
Bis jetzt hat alles ohne MALLOC funktioniert,
ich bin mir aber trotzdem nicht sicher, ob ich
nicht bereits bei der Zeichenkettenzuweisung
über die Feldgrenze hinausschreibe.
Ich habe z. B. gemerkt, dass ein strcat mit 2
Zeichen funktioniert, bei mehr Zeichen aber
segfaultet. Da hat ein realloc geholfen. Das
mein Programm mit einem "kurzen" strcat nicht
abstürzt, seher ich eher als Zufall.
-
Du
kannst
den
char
Pointer
auch
erst
später
zuweisen.
Warum
schreibst
Du
so
seltsam
?
-
Ein char* ist erstmal ein Zeiger.
Wie groß der Bereich ist, auf den er zeigt kann man nicht feststellen.Wo dieser Bereich her kommt (Array oder malloc) ist auch egal.
Hauptsache, er zeigt auf gültigen und ausreichenden Speicher.Zeig mal Beispielcode, damit man sehen kann was du genau meinst.
-
char *t = "Hallo Welt"; //erlaubt char *p; p = "Hallo Welt"; // Falsch denke da wird ein compilerfehler auftreten strcpy(p,"Hallo Welt"); // Funktioniert aber Buffer Overflow das kann zu undefinierten Verhalten führen sollte aufjedenfall vermieden werden [code="c"] richtig wäre
char *p;
p = (charmalloc( sizeof(char) * ( strlen("Hallo Welt") + 1 ));
strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1);
[code="c"]
-
char *t = "Hallo Welt"; //erlaubt char *p; p = "Hallo Welt"; // Falsch denke da wird ein compilerfehler auftreten strcpy(p,"Hallo Welt"); // Funktioniert aber Buffer Overflow das kann zu undefinierten Verhalten führen sollte aufjedenfall vermieden werden
richtig wäre
char *p; p = (char *) malloc( sizeof(char) * ( strlen("Hallo Welt") + 1 )); strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1);
-
char *t = "Hallo Welt"; //erlaubt char *p; p = "Hallo Welt"; // Das ist völlig in Ordnung. p zeigt jetzt auf das Stringliteral "Hallo Welt" strcpy(p,"Hallo Welt"); // In diesem Fall gibt es auch kein Buffer Overflow, da beide Strings gleich lang sind. // Aber Stringliterale sind nur zum lesen da. D.h du darfst an die Stelle nichts kopieren.
char *p; p = (char *) malloc( sizeof(char) * ( strlen("Hallo Welt") + 1 )); // Cast ist nicht nötig, sizeof(char) ist per default 1) // Hier fehlt die Fehlerbehandlung für malloc strncpy(p,"Hallo Welt",strlen("Hallo Welt")+1); // Warum strncpy, du hast doch genung SPeicher.
Das Ganz hat relativ wenig Sinn, da du so auch nicht mehr Speicher hast als beim Stringliteral.
Wenn den Bereich beschreiben willst kannst du auch ein Array benutzen (Beachte aber die Lebenszeit (Scope))
char p[] = "Hallo Welt";
-
er will es mit einem char* und nicht mit einem char Array lies dir seine Frage durch
-
@kknd
Danke, du hast meine Frage beantwortet! Aber wenn ich mir den ein oder
anderen bestehenden Code von manchen Linux Programmen ansehe, wird nicht
immer durch MALLOC Speicher angefordert. Meistens erfolgt nach der
Deklaration eine Zeichenkettenzuweisung, manchmal seh ich auch ein
realloc. Das würde also heissen, wenn ich keinen Speicher anfordere und
eine Zeichenkette einfach zuweise, dann ist es reiner Zufall, dass mein
Programm nicht abstürzt?Ich muss char* nehmen, da ich ein paar Veränderungen an einem bestehenden
Code mache. Und da wird mit char Zeigern gearbeitet.
-
Du denkst auf der falschen Abstraktionsebene. Frag dich einfach immer: Wohin werden die Bytes geschrieben? Wenn der Zeiger nicht garantiert auf irgendein schreibbares Objekt zeigt, machst du was falsch.
wird nicht immer durch MALLOC Speicher angefordert.
Die Funktion heißt übrigens malloc. Groß/Kleinschreibung ist wichtig in C. Davon ab, natürlich ist es nicht notwendig, immer malloc zu verwenden. Siehe die Grundregel oben.
Meistens erfolgt nach der Deklaration eine Zeichenkettenzuweisung, manchmal seh ich auch ein
realloc.Ja, und?
Das würde also heissen, wenn ich keinen Speicher anfordere und
eine Zeichenkette einfach zuweise, dann ist es reiner Zufall, dass mein
Programm nicht abstürzt?Wieder: Du denkst auf der falschen Abstraktionsebene. Es gibt in C keine "Zeichenketten", die man "zuweisen" kann. Es gibt Zeichen, es gibt Zeiger, es gibt Arrays. Man kann allerlei Zeug zuweisen, aber keine Arrays, die kann man nur elementweise zuweisen. Als Sonderfall gibt es noch Zeichenkettenkonstanten. Da ich jetzt Gefahr laufe, die Postings der anderen zu wiederholen, hör ich jetzt auf. Vielleicht solltest du nochmal eine konkrete Frage stellen
-
kknd schrieb:
er will es mit einem char* und nicht mit einem char Array lies dir seine Frage durch
Er wäre nicht der erste, der für eine falsche Lösung den richtigen Ansatz sucht.