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 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

Schreibe einen Kommentar