Kann mir jemand erklären, was der Unterschied zwischen diesen Codezeilen ist
char *p = "String";
char p2[] = "String";
char p3[7] = "String";
In welchem Fall sollte ich jedes der oben genannten verwenden?
sommerc
Kann mir jemand erklären, was der Unterschied zwischen diesen Codezeilen ist
char *p = "String";
char p2[] = "String";
char p3[7] = "String";
In welchem Fall sollte ich jedes der oben genannten verwenden?
fge
Dieser Link sollte Ihre Neugier befriedigen.
Grundsätzlich (vergessen Sie Ihr drittes Beispiel, das schlecht ist) besteht der Unterschied zwischen 1 und 2 darin, dass 1 Platz für einen Zeiger auf das Array zuweist.
Aber im Code können Sie sie trotzdem als Zeiger manipulieren – nur können Sie den zweiten nicht neu zuweisen.
Jungs, bevor Sie den Link, den fge gepostet hat, mit einem Lesezeichen versehen, beachten Sie, dass die FAQ-Website entsprechend aktualisiert wurde c-faq.com und der spezifische Link, der dazu gepostet wurde c-faq.com/aryptr (2.1,2.2) aber ohne Änderungen. Nur für den Fall.
– Yannis Dran
12. Januar 2019 um 16:08 Uhr
ob_dev
Strings werden in C als Arrays von Zeichen dargestellt.
char *p = "String";
Sie deklarieren einen Zeiger, der auf eine Zeichenfolge zeigt, die irgendwo in Ihrem Programm gespeichert ist (das Ändern dieser Zeichenfolge ist ein undefiniertes Verhalten), gemäß der Programmiersprache C, 2. Ausgabe.
char p2[] = "String";
Sie deklarieren ein Array von Zeichen, das mit der Zeichenfolge “String” initialisiert wurde, und überlassen dem Compiler die Aufgabe, die Größe des Arrays zu zählen.
char p3[5] = "String";
Sie deklarieren ein Array der Größe 5 und initialisieren es mit “String”. Dies ist ein Fehler, weil “String” nicht in 5 Elemente passt.
char p3[7] = "String";
ist die korrekte Deklaration (‘\0’ ist das abschließende Zeichen in c-Strings).
Nur ein Hinweis, dass der Link aktualisiert wurde c-faq.com/charstring/index.html
– jwknz
16. August 2013 um 23:01 Uhr
Sie sollten das dritte nicht verwenden, weil es falsch ist. “String” benötigt 7 Bytes, nicht 5.
Der erste ist ein Zeiger (kann einer anderen Adresse zugewiesen werden), die anderen beiden sind als Arrays deklariert und können nicht anderen Speicherorten zugewiesen werden (aber ihr Inhalt kann sich ändern, use const
um das zu vermeiden).
char p3[5] = "String";
Während gefährlich nicht falsch ist und in C gültig ist (aber nicht in C++)
– au
4. Januar 2012 um 19:05 Uhr
@ouah – es ist falsch. Es kann die Kompilierung bestehen, ist es aber trotzdem falsch.
– wenigadv
4. Januar 2012 um 19:06 Uhr
dies ist eine streng konforme Definition für ein Objekt. Ein streng konformes Programm ist nicht “falsch” in Bezug auf C.
– au
4. Januar 2012 um 19:15 Uhr
@ouah Blatant Laufzeitfehler sind falsch.
– Chris Eberle
4. Januar 2012 um 19:47 Uhr
@ Pacerier, bitte hör auf, absichtlich pedantisch zu sein. Sie wissen sehr gut, dass meine Aussage nicht bedeutet „macht das Programm unbrauchbar“. Der umgebende Code ist irrelevant. Wenn ich in einen Speicher schreibe, in den ich nicht schreiben sollte, ist das schlechtes Benehmen. Das ist ein Fehler. Auch wenn es niemand merkt, ist das immer noch ein Bug. Auch wenn mein Code nie ausgeführt wird, ist immer noch ein Fehler vorhanden. Der Fehler wird möglicherweise nicht ausgeführt, aber das bedeutet nicht, dass mein Code fehlerfrei ist. Hör auf mit den Spielchen, du bist nicht schlau.
– Chris Eberle
19. Dezember 2014 um 4:10 Uhr
SKM
char *p = "String"; means pointer to a string type variable.
char p3[5] = "String"
; bedeutet, dass Sie die Größe des Arrays so vordefinieren, dass es aus nicht mehr als 5 Elementen besteht. Beachten Sie, dass für Zeichenfolgen die Null “\0” auch als Element betrachtet wird. Diese Anweisung würde also einen Fehler ergeben, da die Anzahl der Elemente 7 ist, also sollte es sein:
char p3[7]= "String";
Nun, das letzte ist ein Pufferüberlauf, also ist das nett.
– Dan
4. Januar 2012 um 18:57 Uhr
Sie drittes Beispiel sollte sein
p3[6]
: Sie müssen die abschließende 0 berücksichtigen– fg
4. Januar 2012 um 18:57 Uhr
@fge: braucht tatsächlich 7.
– Matte
4. Januar 2012 um 18:58 Uhr
@Dan eher Kompilierungsfehler
– wenigadv
4. Januar 2012 um 18:58 Uhr
Das dritte Beispiel wird bearbeitet
– sommerc
4. Januar 2012 um 19:00 Uhr