[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
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
A voir également:
- [C] Erreur de segmentation avec char *
- Erreur de segmentation c - Astuces et Solutions
- Segmentation fault (core dumped) ✓ - Forum Programmation
- Erreur de segmentation (core dumped) ✓ - Forum C
- Erreur 1004 vba ✓ - Forum VB / VBA
- Erreur 1000 france tv - Forum MacOS
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 522
5 mai 2007 à 15:32
5 mai 2007 à 15:32
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...