[C] Erreur de segmentation avec char *
vinz
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
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.
Merci de votre aide.
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.
A voir également:
- Erreur de segmentation c
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
1 réponse
Quand tu déclares une chaine de cette manière:
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:
Ou encore:
2) Tu construis ta chaine dans une zone mémoire (prenons toujours un tableau) caractère par caractère:
M'enfin bon là faut le vouloir...
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...