Ok, ça m'a l'air basique et le retourner dans les sens, j'ai une erreur de segmentation sur l'instruction en rouge :cry:Code:
1
2
3
4
5
6
7
8
9 int main(int argc, char *argv[]) { char *p="Hello", a[]="Zello"; a[0]='H'; *(p+0)='Z'; return(0); }
Version imprimable
Ok, ça m'a l'air basique et le retourner dans les sens, j'ai une erreur de segmentation sur l'instruction en rouge :cry:Code:
1
2
3
4
5
6
7
8
9 int main(int argc, char *argv[]) { char *p="Hello", a[]="Zello"; a[0]='H'; *(p+0)='Z'; return(0); }
Salut,
c'est normal, tu ne peux pas modifier "Hello" (le comportement est non défini).
p est un pointeur vers une chaine de caractères (un string literal ici), alors que a est un tableau de caractères que tu initialises avec "Hello".Citation:
Envoyé par N1256
Tu peux modifier le contenu de a, mais pas la chaine pointé par p.
Pour compléter ce que vient de dire gulain, il faut savoir que quand tu fais ça :
char *p="Hello", aucun espace mémoire n'est réservé sur le tas comme ce serait le cas avec malloc, ou sur la pile comme ce serait le cas avec le tableau a. La chaine "Hello" est mise dans une zone spécifique de la mémoire où sont placées les constantes. Tu ne peux donc pas modifier les données pointées par p, bien que tu puisses modifier p lui-même.
Mon échange avec gangsoleil dans cette discussion pourra t'intéresser : http://www.developpez.net/forums/d12...n/#post6770934
PS : char *p="Hello" est une allocation statique : http://fr.wikipedia.org/wiki/Allocation_de_m%C3%A9moire
Merci Messieurs pour ces réponses qui sont fondées.
Je sentais bien l'effet "Constante"
Aussi, je dois revoir un aspect d'un plus gros programme dans lequel un tableau de pointeurs de char est initialisé avec des chaînes littérales.
Certaines de ces chaînes sont dynamiquement modifiées.
Bon pour du malloc, dommage je l'aimais bien cette souplesse d'assignation :roll:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #define LEVELS 10 #define MENU_PROMPT_ROOT "[E]xit [H]elp [S]how [D]ump ___________________" ... #define MENU_PROMPT_MEMY "[<]Back [A]rray ____________________________" #define LV_ROOT 0 ... #define LV_ATTY 8 #define LV_STRY 9 char *menuPrompt[LEVELS]= { MENU_PROMPT_ROOT, ... MENU_PROMPT_MEMY, MENU_PROMPT_MEMY }; menuPrompt[LV_ATTY][23]='[';
Résolu par :
En revanche, cela implique une longueur = 66 char pour toutes les littérales, voire > 66 avec warning du compilateur.Code:
1
2
3
4
5
6
7 char menuPrompt[LEVELS][66]= { MENU_PROMPT_ROOT, ... MENU_PROMPT_MEMY, MENU_PROMPT_MEMY };
Et < à 66, ça tappe dans l'inconnu :)
Cela implique une longueur inférieure ou égale à 65 (66 avec le caractère de fin de chaine), plutôt ?
Sinon il y a strdup de la bibliothèque string.h qui fait à la fois l'allocation mémoire et l'assignation
Si tu remplaces
parCode:char *p="Hello"
tu n'auras plus ton erreur de segmentationCode:char *p=strdup("Hello")
Cette fonction n'est pas standard, mais malgré tout assez portable puisque POSIX.1.
Merci, je la garde sous le coude; mais depuis les heures ont coulé et par rage j'ai tout changé pour des tableaux à taille fixe :cry:
En fait je souhaitais définir dans le header file, une matrice de hauteur et de largeur résolues par le compilateur, avec surtout pour chaque ligne, un nombre variable de colonnes.
Où '$' et '%' sont les délimiteurs scannés par les boucles.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <stdio.h> int main(int argc, char *argv[]) { int x=0, y=0; char *M[]= { "1234567890$", "123$", "abcdefgh$", "%" }; while(M[y][x]!='%') { while(M[y][x]!='$') { printf("%c",M[y][x]); x++; } printf("\n"); x=0; y++; } return(0); }
Maintenant on y ajoute la réécriture et " Segmentation fault "
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <stdio.h> int main(int argc, char *argv[]) { int x=0, y=0; char *M[]= { "1234567890$", "123$", "abcdefgh$", "%" }; while(M[y][x]!='%') { while(M[y][x]!='$') { printf("%c",M[y][x]); x++; } printf("\n"); x=0; y++; } M[2][3]='C'; return(0); }
C'est le même problème sauf que dans ce cas au lieu d'avoir un pointeur vers une chaine de caractères, tu as un tableau de pointeurs vers des chaines de caractères.
Tu essaies donc toujours de modifier des chaines constantes.