Les littéraux de chaîne: pointeur vs char tableau

Dans cette déclaration:

char *a = "string1"

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

Jusqu'à ma connaissance

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

Veuillez ajouter quelques détails autres que les points mentionnés ci-dessus. Merci.

Sortie de débogage montre l'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 = "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
le code est illégale, car c'est la tentative de modifier une chaîne de caractères littérale.
Je ne suis pas certain que la question exacte est. Pour plus de détails sur les littéraux de chaîne, voir section 6.4.5 de la norme C99.
Peut-être ce stackoverflow question peut aider, ou celui-ci.
Vous connaissez déjà la modification de littéraux de chaîne est UB et, heureusement, vous obtenez l'erreur lorsque vous essayez de le faire. GDB montre vous obtenez l'erreur de segmentation lorsque vous les modifiez. Quelle est la question?
OK, donc techniquement, char *a = "string1"; devrait générer un avertissement du compilateur sur l'initialisation d'un char * avec un const char * valeur. Je suppose que la seule raison pour laquelle il n'a pas raison en est que beaucoup trop de code hérité permettrait de lancer des avertissements.

OriginalL'auteur Jeyaram | 2012-10-09