Littéraux de chaîne: pointeur ou tableau de caractères

Dans cette déclaration:

char *a = "ssortingng1" 

Qu’est-ce que le littéral de chaîne? Est-ce ssortingng1 ? Parce que ce fil Quel est le type de littéraux de chaîne en C et C ++? dit quelque chose de différent.

À ma connaissance

 int main() { char *a = "ssortingng1"; //is a ssortingng- literals allocated memory in read-only section. char b[] = "ssortingng2"; //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; } 

S’il vous plaît append quelques détails autres que les points mentionnés ci-dessus. Merci.

Sortie de débogage Affichage d’une erreur dans 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 = "ssortingng1"; (gdb) n 7 char b[] = "ssortingng2"; (gdb) 9 a[0] = 'Y'; (gdb) Program received signal SIGSEGV, Segmentation fault. 0x0000000000400595 in main () at ddd.c:9 

Vous pouvez regarder le littéral de chaîne comme “une séquence de caractères entourée de guillemets” . Cette chaîne est stockée dans la mémoire en lecture seule et toute tentative de modification de cette mémoire entraîne un comportement indéfini .

Alors, comment se fait-il que vous obteniez une erreur de segmentation?
– Le point principal est que char *ptr = "ssortingng literal" fait que ptr pointe sur la mémoire en lecture seule dans laquelle votre chaîne littérale est stockée. Ainsi, lorsque vous essayez d’accéder à cette mémoire: ptr[0] = 'X' (ce qui équivaut par ailleurs à *(ptr + 0) = 'X' ), il s’agit d’une violation d’access à la mémoire .

D’autre part: char b[] = "ssortingng2"; y alloue de la mémoire et y copie la chaîne "ssortingng2" , ce qui la modifie est valide. Cette mémoire est libérée lorsque b sort de la scope.

Regardez l’ initialiseur de chaîne littérale pour un tableau de caractères