Pour resumer, on ne peut pas acceder au contenu de la chaine, mais nous pouvons pourtant acceder a son espace memoire en faisant un free(),
free libère simplement la zone de mémoire allouée, ce qui ne veut pas dire que son contenu est effacé pour autant mais que cette zone pourra ultérieurement être réutilisée par un autre malloc. Si tu accèdes à une zone mémoire que tu as libérée, c'est dangereux car là alors plus rien ne peut t'assurer que les données présentes sont toujours intactes. De plus, un simple accès risque de faire planter ton programme.
Pour imager (juste pour expliquer l'idée), deux exemples un peu HS :
1 ) C'est un peu la même chose lorsque tu effaces un fichier de ton disque dur. Si aucun autre fichier n'est recréé ou modifié, on pourra toujours lire le contenu du fichier effacé. Effacer un fichier ne veut pas dire "effacer son contenu", mais cela veut simplement dire que les blocs qui lui étaient réservés sont libérés, c'est-à-dire qu'ils pourront ultérieurement être réutilisés pour un autre fichier. Tant que rien de nouveau n'a été créé, les données sont toujours là.
2 ) Autre exemple. Lorsque tu sors d'une fonction qui contient des variables locales, ces variables sont toujours stockées sur la pile mais on ne doit surtout pas y accéder par la suite car à tout moment de nouvelles données peuvent écraser l'ancien contenu, d'où la raison pour laquelle il ne faut jamais renvoyer à la fonction appelante un pointeur vers un objet local (à moins qu'il soit statique, mais là c'est un autre débat).
Pour résoudre ton problème (enfin... à vrai dire, je ne comprends pas ce que tu ne comprends pas ici), tu donnes doit-même la réponse :
Ici, on peut afficher la chaine soit:
1) Si on retourne str de full_str().
2) Si on envoie &str a full_str en recuperant un char *(*str).
Par conséquent, dans le code que tu viens de donner, la fonction appelante (ie main) ne connaîtra jamais ce que malloc a retourné, et sa variable locale str restera désespérément à NULL. Par contre, la mémoire allouée est toujours allouée (que tu restes dans la fonction ou que tu en sortes), et son contenu ne changera plus, et ce tant que le programme tournera. Mais comme la valeur du pointeur est perdue, cela correspond alors à une fuite de mémoire, puisqu'il n'y aura plus aucun moyen de libérer cette mémoire jusqu'à ce que le programme se termine.
esce parce que la fonction malloc renvoie un pointeur vers l'adresse de str ?
malloc renvoie simplement un pointeur vers la mémoire allouée. Dans ton exemple, il y a 2 octets d'alloués :
2 * sizeof(*str) /* = 2 * 1 = 2 */
Le premier octet de la mémoire allouée est rempli par 'A' et le second par '\0'.
Desole d'insister mais je n'ose plus coder tant que je ne maitriserai pas la question^^
Mais le problème, c'est que je ne comprends pas ce que tu ne comprends pas. Et apparemment, je ne suis pas le seul.
Partager