Dans le premier exemple, le pointeur t
est amené à pointer sur une constante de chaîne "Hello"
, puis immédiatement après à la constante de chaîne "World"
; la dernière valeur est ensuite imprimée.
Le code du second exemple se bloque avec segfault car les constantes de chaîne ne sont pas inscriptibles. (strcpy essaie de modifier la mémoire qui contient le texte "Hello"
). GCC place les constantes de chaîne dans une section en lecture seule, sauf si elles sont compilées avec -fwriteable-strings
.
Le code
char *test = "Hello";
signifie que le compilateur + lieu de linker une chaîne d'octets « Bonjour \ 0 » dans une section en lecture seule, et les test
des points dans le premier caractère de celui-ci. Toute tentative d'écriture à travers ce pointeur serait sévèrement punie par le système d'exploitation.
D'autre part
char test[] = "Hello";
déclare un tableau de 6 caractères, avec une valeur initiale de ({ 'H', 'e', 'l', 'l', 'o', '\0' }
).
Certains anciens programmes supposaient que les constantes de chaîne étaient accessibles en écriture; GCC doit donc prendre en charge la compilation de ces programmes avec le commutateur de ligne de commande -fwriteable-strings
.
J'utilise le compilateur gcc – user2076561
'char * t =" Hello ";" est un pointeur qui pointe vers une chaîne littérale. Vous pouvez l'assigner librement à une autre chaîne littérale mais ne peut pas stocker certaines données (chaîne par exemple) dans cette mémoire.C'était l'essence de la réponse ci-dessous que je pense que quelqu'un downvoted - Si vous êtes le seul - s'il vous plaît allez et revenez-y. –