char-array mit string initialisieren
Moin zusammen! Da hier ist mal wieder eine Einsteigerfrage, aber ich kriege es nicht auf die Reihe: Warum kann ich nicht ein char-Array deklarieren und spüäter mit einem String initialisieren? So funtioniert es: char v[20]="text"; so aber nicht: char v[20]; v="text"; viele dank schon im voraus Volker ______________________________________________________________________________ ComputerBild (15-03) empfiehlt: Der beste Spam-Schutz ist bei WEB.DE FreeMail - Deutschlands beste E-Mail - http://s.web.de/?mc=021124
On Mon, 28 Jul 2003 at 18:53 (+0200), volker wirth wrote:
Moin zusammen!
Da hier ist mal wieder eine Einsteigerfrage, aber ich kriege es nicht auf die Reihe:
Warum kann ich nicht ein char-Array deklarieren und spüäter mit einem String initialisieren?
So funtioniert es:
char v[20]="text";
so aber nicht:
char v[20]; v="text";
v ist ein konstanter Zeiger auf das erste Element eines char-Arrays. Die Zuweisung v = "text" würde nun diesen Zeiger verändern und auf was neues Zeigen => geht nicht. Richtig (wenn von der Länge her OK): strcpy (v, "text"); Gruß, Bernhard -- "Regular ist rekursiv. Ein User ist ein Regular, wenn er von den Regulars als Regular angesehen wird." -- Sebastian Posner in de.alt.folklore.usenet
On Monday 28 July 2003 18:53, volker wirth wrote:
Da hier ist mal wieder eine Einsteigerfrage, aber ich kriege es nicht auf die Reihe: Warum kann ich nicht ein char-Array deklarieren und spüäter mit einem String initialisieren? So funtioniert es:
char v[20]="text";
Das ist das gleiche wie char v[20] = { 't', 'e', 'x', 't', '\0' }; das läßt der Compiler nur zwecks Faulheit zu, weil es so schön praktisch ist. Das geht auch nur, weil im compilierten Code für initialisierte Daten sowieso ein Stück Bytes reserviert ist; da ist es auch schon egal, ob der Compiler lauter Nullen oder eben Deinen Text reinschreibt. Zur Laufzeit passiert damit nichts mehr - außer daß auch dieses Stück Deines Programms in den Speicher geladen bzw. gemappt wird.
so aber nicht:
char v[20]; v="text";
Hier müßte auch der Compiler selbständig eine Kopierfunktion aufrufen, die an
dieser Stelle noch nicht einmal definiert ist. Du mußt schon selber sagen,
was passieren soll - etwa "strcpy()".
Übrigens: Wenn Du sowieso nur den vordefinierten Text drinhaben willst, kannst
Du es auch dem Compiler überlassen, die Länge auszurechnen - also bei der
Deklaration einfach die "20" weglassen:
char v[] = "text";
Dann werden automatisch genau so viele Zeichen reserviert, wie bei der
Initialisierung angegeben - plus eines für das Nullbyte am Ende.
CU
--
Stefan Hundhammer
Moin,
* Stefan Hundhammer
On Monday 28 July 2003 18:53, volker wirth wrote:
[geht nicht]:
char v[20]; v="text";
Hier müßte auch der Compiler selbständig eine Kopierfunktion aufrufen, die an dieser Stelle noch nicht einmal definiert ist. Du mußt schon selber sagen, was passieren soll - etwa "strcpy()".
Übrigens: Wenn Du sowieso nur den vordefinierten Text drinhaben willst, kannst Du es auch dem Compiler überlassen, die Länge auszurechnen - also bei der Deklaration einfach die "20" weglassen:
char v[] = "text";
Dann werden automatisch genau so viele Zeichen reserviert, wie bei der Initialisierung angegeben - plus eines für das Nullbyte am Ende.
Und falls Du später doch mehr als diesen Platz brauchst, solltest Du ein #define benutzen: #define MAX_TEXT_LEN 20 char myString[MAX_TEXT_LEN] = "text"; Dann kannst Du später sauber immer wieder auf die Länge zugreifen: dest = (char*) malloc(MAX_TEXT_LEN); /* Auf Fehler überprüfen! */ strncpy(dest, myString, MAX_TEXT_LEN) *(dest + MAX_TEXT_LEN - 1) = '\0'; (Bestimmt steckt jetzt irgendwo ein off-by-one-Fehler.) Thorsten -- In den letzten Jahren zeichnet in der westlichen Welt niemand, weder die extreme politische Rechte noch die extreme politische Linke, für so viele Einschränkungen von Freiheitsrechten verantwortlich wie die Content-Industrie. - Peter Riedlberger
participants (4)
-
Bernhard Walle
-
Stefan Hundhammer
-
Thorsten Haude
-
volker wirth