[C] Erreur de segmentation avec char *

vinz -  
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   -
bonjour,

Voila mon programme qui me donne un segmentation fault. Laors que lorsque je remplace char *s par char s[], ca fonctionne.

int main() {
        char *s = "kkkkkkkkkkkkkkkkkkkkkkkkkkkkk";
        s[1] = 'G';
        printf("s = %s\n", s);

        return 0;
}



Merci de votre aide.

1 réponse

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Quand tu déclares une chaine de cette manière:
char *s ="ssssssssss";


Le système d'exploitation va réserver une zone dans la mémoire avec cette chaine.
Mais cette zone de mémoire aura le statut de "lecture seule". Tu ne peux que lire ces données, tu ne peux donc pas écrire dans cette zone qui est pointée par s.

C'est pourquoi toute chaine en C déclarée avec des guillemets doubles est considérée comme constante.

Il y a des moyens simples pour pallier à ce genre de difficulté:

1) La chaine est toujours constante et stockée en mémoire, mais elle est copiée dans une zone mémoire dans laquelle tu peux écrire.
Cette zone peut être un tableau:
char s[] = "ssss";

Ou encore:
char s[5] //ne pas oublier une case pour le caractère de fin de chaine '\0';
strcpy(s, "ssss");


2) Tu construis ta chaine dans une zone mémoire (prenons toujours un tableau) caractère par caractère:
char s[] = {'s', 's', 's', 's', '\0'};

M'enfin bon là faut le vouloir...
1