Salut
quand j' assigne l' adresse d' une constante à un pointeur :
char *p;
p = "coucou developpez"
est-ce qu' il s' agit d' une forme d' allocation dynamique ? La constante est stockée en mémoire, puis oubliée si je fait pointer p sur NULL. Y à t' il une table qui gère toute ses allocation ?
La chaine est stockée quelque part en mémoire, dans une zone en lecture seule. En cas de modification de la chaine, le programme crashe. Il n'y a pas d'allocation dynamique, il ne faut surtout pas faire de free dessus.
Quand tu écris une chose du genre :
char p[] = "coucou developpez" ;
là, "p" n'est plus un pointeur mais un tableau, initialisé avec la chaine entre guillemets. Son contenu est modifiable, ce tableau est situé dans une autre zone de mémoire.
Le cas où on parle d'allocation dynamique serait quelque chose du genre :
1 2 3 4 5
| char * p;
char * chaine = "coucou developpez";
p = malloc (strlen(chaine) + 1); /* Allocation dynamique */
strcpy(p , chaine) ; /* On remplit la mémoire allouée avec la chaine "coucou developpez" */ |
dans ce cas, il faudrait effectuer un free sur p lorsqu'on ne compte plus se servir de cette chaine.
~~~~~~~~
j' ai une dernière question (qui semble montrer que je n' ai compris aussi bien que je l' espérais) ; dans ce code :
1 2 3 4 5
| void strcpy(char *CH1, char *CH2)
{
while (*CH1++ = *CH2++)
;
} |
la constante pointée par CH1 est modifiée. Il ne peut donc pas s' agir d' une constante ? Pourquoi ce genre de code ne peut-il pas donner d' erreur de segmentation ?
Si tu envoies l'adresse d'une chaine constante comme premier argument de la fonction, le programme crashe. On ne peut pas modifier une chaine constante.
Si le contenu de CH2 est plus grande que celui de CH1, la chaine ne va t' elle pas s' étendre dans une zone incertaine de la mémoire ? (à la place d' une autre variable ..)
Si. Et c'est souvent le genre de bug qui fait sortir de la fumée des oreilles, si on n'a pas l'oeil. Il est préférable d'utiliser strncpy que strcpy à cause de ce genre de raison.
Partager