[C] Erreur de segmentation avec char *

Fermé
vinz - 5 mai 2007 à 15:11
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 5 mai 2007 à 15:32
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
5 mai 2007 à 15:32
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