Je pense que tu n'as pas tout à fait compris les liens entre chaînes de caractères, pointeurs, et mémoire physique.
En C, les chaînes de caractères sont définies en mémoire comme une suite de caractères contigus terminée par le caractère NUL, '0円'.
Par exemple, en imaginant la mémoire physique comme un tableau:
[ 'H' | 'e' | 'l' | 'l' | 'o' | '0円' ]
Maintenant, comment représente-t-on, ou accède-t-on à un espace mémoire en C ?
* Un pointeur contient l'adresse d'une zone mémoire quelconque. On peut donc l'associer avec n'importe quel espace mémoire (à ses risques et périls).
* Le tableau définit entièrement un espace mémoire; il pointe implicitement vers l'emplacement mémoire de son premier élément.
donc :
char *pointeur = NULL; n'est pas une chaine de caractère, il n'a pas de mémoire associée
char tableau[6] = { 'H', 'e', 'l', 'l', 'o' }; est une chaine de caractère; le nom 'tableau' renvoie directement à la mémoire contenant "Hello";
Pour avoir une 'chaîne de caractère' avec un pointeur, il faut donc lui associer de la mémoire.
pointeur = tableau;
On associe l'espace mémoire contenant la chaîne "Hello" du tableau à notre pointeur. Attention, le pointeur et le tableau référencent par conséquent la même mémoire 'physique'. Donc changer la chaîne avec pointeur[0] = 'h'; par exemple modifiera le tableau aussi ;)
A noter: dès qu'un pointeur est associé à un espace mémoire, on peut le manipuler comme un tableau. On peut aussi jouer sur l'adresse enregistrée pour se "déplacer" dans la zone. Par exemple, pointeur ++ positionnera le pointeur sur le 'e' de "Hello".
On peut aussi demander un nouvel espace mémoire au système en utilisant malloc, qui renvoie un pointeur.
Pour copier "Hello", on peut donc faire:
pointeur = malloc( (strlen(tableau) + 1) * sizeof(*pointeur));
^ taille de la chaine ^ taille du type de tableau
Attention au '+1', il ne faut pas oublier le zero final !
A ce stade, on a une nouvelle zone mémoire vierge de la même taille que "Hello". On va donc copier le tableau dans la nouvelle zone mémoire.
strncpy(pointeur, tableau, sizeof(tableau));
Voilà, on dispose d'une copie de la chaîne "Hello".
Si je n'ai pas été trop confus dans mes explications, tu devrais donc voir que ton programme plante, car tu utilises le pointeur temp sans lui avoir associé un espace mémoire.
Dans ce cas, strncpy() écrit n'importe où, et strstr() lit on ne sait où...
Ce désordre met Linux en colère, qui abat alors froidement ton programme d'un SIGSEGV dans la nuque, ce qui se résume souvent par un pauvre "Segmentation fault" dans ton terminal.
# Pointeurs...
Posté par JaguarWan . En réponse au message string.h et pointeurs.... Évalué à 4.
En C, les chaînes de caractères sont définies en mémoire comme une suite de caractères contigus terminée par le caractère NUL, '0円'.
Par exemple, en imaginant la mémoire physique comme un tableau:
[ 'H' | 'e' | 'l' | 'l' | 'o' | '0円' ]
Maintenant, comment représente-t-on, ou accède-t-on à un espace mémoire en C ?
* Un pointeur contient l'adresse d'une zone mémoire quelconque. On peut donc l'associer avec n'importe quel espace mémoire (à ses risques et périls).
* Le tableau définit entièrement un espace mémoire; il pointe implicitement vers l'emplacement mémoire de son premier élément.
donc :
char *pointeur = NULL; n'est pas une chaine de caractère, il n'a pas de mémoire associée
char tableau[6] = { 'H', 'e', 'l', 'l', 'o' }; est une chaine de caractère; le nom 'tableau' renvoie directement à la mémoire contenant "Hello";
Pour avoir une 'chaîne de caractère' avec un pointeur, il faut donc lui associer de la mémoire.
pointeur = tableau;
On associe l'espace mémoire contenant la chaîne "Hello" du tableau à notre pointeur. Attention, le pointeur et le tableau référencent par conséquent la même mémoire 'physique'. Donc changer la chaîne avec pointeur[0] = 'h'; par exemple modifiera le tableau aussi ;)
A noter: dès qu'un pointeur est associé à un espace mémoire, on peut le manipuler comme un tableau. On peut aussi jouer sur l'adresse enregistrée pour se "déplacer" dans la zone. Par exemple, pointeur ++ positionnera le pointeur sur le 'e' de "Hello".
On peut aussi demander un nouvel espace mémoire au système en utilisant malloc, qui renvoie un pointeur.
Pour copier "Hello", on peut donc faire:
pointeur = malloc( (strlen(tableau) + 1) * sizeof(*pointeur));
^ taille de la chaine ^ taille du type de tableau
Attention au '+1', il ne faut pas oublier le zero final !
A ce stade, on a une nouvelle zone mémoire vierge de la même taille que "Hello". On va donc copier le tableau dans la nouvelle zone mémoire.
strncpy(pointeur, tableau, sizeof(tableau));
Voilà, on dispose d'une copie de la chaîne "Hello".
Si je n'ai pas été trop confus dans mes explications, tu devrais donc voir que ton programme plante, car tu utilises le pointeur temp sans lui avoir associé un espace mémoire.
Dans ce cas, strncpy() écrit n'importe où, et strstr() lit on ne sait où...
Ce désordre met Linux en colère, qui abat alors froidement ton programme d'un SIGSEGV dans la nuque, ce qui se résume souvent par un pauvre "Segmentation fault" dans ton terminal.