String-Literale: Zeiger vs. char-array
In dieser Aussage:
char *a = "string1"
Was genau ist die string-literalen? Ist es string1
? Da dieser thread Was ist der Typ von string-Literale in C und C++? sagt etwas anderes.
Bis zu meinem wissen
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Bitte fügen Sie einige details, die andere als die oben erwähnten Punkte. Danke.
Die Debug-Ausgabe Zeigt Fehler in a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out
Breakpoint 1, main () at ddd.c:4
4 {
(gdb) n
6 char *a = "string1";
(gdb) n
7 char b[] = "string2";
(gdb)
9 a[0] = 'Y';
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9
der code ist ungültig, da es versucht zu ändern, ein string-literal.
Ich bin unsicher, was die genaue Frage ist. Für spezifische details zur string-Literale, siehe Abschnitt 6.4.5 der C99-standard.
Vielleicht diese stackoverflow-Frage helfen kann, oder eins.
Sie wissen bereits, ändern von string-literalen ist UB und zum Glück bekommen Sie segfault, wenn Sie versuchen, das zu tun. GDB zeigt Ihnen, get segfault, wenn Sie es ändern. Was ist hier die Frage?
OK, also technisch
Ich bin unsicher, was die genaue Frage ist. Für spezifische details zur string-Literale, siehe Abschnitt 6.4.5 der C99-standard.
Vielleicht diese stackoverflow-Frage helfen kann, oder eins.
Sie wissen bereits, ändern von string-literalen ist UB und zum Glück bekommen Sie segfault, wenn Sie versuchen, das zu tun. GDB zeigt Ihnen, get segfault, wenn Sie es ändern. Was ist hier die Frage?
OK, also technisch
char *a = "string1";
generieren soll eine compiler-Warnung über die Initialisierung einer char *
mit einem const char *
Wert. Ich vermute, dass der einzige Grund, es nicht ist, weil viel zu viel legacy-code starten werfen Warnungen.
InformationsquelleAutor Jeyaram | 2012-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kannst du schauen string-literal als "eine Folge von Zeichen, die durch Anführungszeichen eingeschlossen".
Dieser string ist gespeichert im nur-lese-Speicher und versuchen, ändern Sie diesen Speicher führt zu Undefiniertes Verhalten.
So, wie Sie kommen, erhalten Sie einen segmentation fault?
- Der wichtigste Punkt ist, dass
char *ptr = "string literal"
machtptr
auf den nur-lese-Speicher, wo dein string-literal gespeichert. Also, wenn Sie versuchen, Zugriff auf diesen Speicher:ptr[0] = 'X'
(das ist übrigens äquivalent zu*(ptr + 0) = 'X'
), es ist ein Speicher-Zugriffsverletzung.Auf der anderen Seite:
char b[] = "string2";
reserviert Speicher und kopiert string"string2"
hinein, so geändert wird, dass Sie gültig ist. Dieser Speicher wird freigegeben, wennb
geht out of scope.Haben Sie einen Blick auf Literal string-Initialisierung für ein Zeichen-array
char a[] = "sdsf";
auch ein string-literal.string literal ist eine Sequenz von Zeichen, die durch Anführungszeichen eingeschlossen". Ja, in
char a[] = "sdsf";
,"sdsf"
ist ein string-literal initialisiert wird arraya
.Danke. also ich missverstanden, dass string-Literale sind Zeichenfolgen, die zugewiesenen Speicher im nur-lese-Abschnitt. Es basiert nicht auf dem Speicher :).
literal" ist nur einige Begriff. Der wichtigste Punkt ist, dass beim abrufen die Adresse der nur-lese-Speicher, wo dein string-literal gespeichert ist (
char *ptr = "string literal"
), und dann Sie versuchen, Zugriff auf diesen Speicher:*(ptr + 1) = 'A'
...Da
const char myyear = "2014"
undconst char *myyear = "2014"
sind verschiedene Dinge.InformationsquelleAutor LihO