Lorsque vous écrivez une "chaîne" dans votre code source, il est écrit directement dans l'exécutable, car cette valeur doit être connue au moment de la compilation (il existe des outils disponibles pour tirer un logiciel à part et de trouver toute la plaine des chaînes de texte dans leur). Lorsque vous écrivez char *a = "This is a string"
, l'emplacement de la "Ceci est une chaîne" est dans le fichier exécutable, et l'emplacement des points de, est dans l'exécutable. Les données dans le fichier exécutable de l'image est en lecture seule.
Ce que vous devez faire (comme les autres réponses ont souligné) est de créer de la mémoire dans un endroit qui n'est pas en lecture seule, sur le tas, ou dans le cadre de la pile. Si vous déclarez un local de tableau, alors l'espace est faite sur la pile pour chaque élément de ce tableau, et la chaîne littérale (qui est stocké dans le fichier exécutable) est copié sur l'espace dans la pile.
char a[] = "This is a string";
vous pouvez également copier les données manuellement par l'allocation de la mémoire sur le tas, et ensuite à l'aide d' strcpy()
pour copier une chaîne de caractères littérale dans cet espace.
char *a = malloc(256);
strcpy(a, "This is a string");
Chaque fois que vous allouer de l'espace à l'aide de malloc()
n'oubliez pas d'appeler free()
quand vous avez fini avec elle (lire: fuite de mémoire).
Fondamentalement, vous devez garder une trace de l'endroit où vos données. Chaque fois que vous écrivez une chaîne de caractères dans votre code source, cette chaîne est en lecture seule (sinon vous seriez susceptible de modifier le comportement de l'exécutable--imaginez si vous avez écrit char *a = "hello";
puis modifiés a[0]
de 'c'
. Puis, quelque part d'autre a écrit printf("hello");
. Si vous avez été autorisé à changer le premier caractère de l' "hello"
, et votre compilateur ne sont stockées qu'une fois (il devrait), alors printf("hello");
sortie cello
!)