Je ne comprends pas pourquoi, dans ce code, l'appel à «Gratuit» provoquer une défaillance de la segmentation:
#include <stdio.h> #include <string.h> #include <stdlib.h> char *char_arr_allocator(int length); int main(int argc, char* argv[0]){ char* stringa = NULL; stringa = char_arr_allocator(100); printf("stringa address: %p\n", stringa); // same address as "arr" printf("stringa: %s\n",stringa); //free(stringa); return 0; } char *char_arr_allocator(int length) { char *arr; arr = malloc(length*sizeof(char)); arr = "xxxxxxx"; printf("arr address: %p\n", arr); // same address as "stringa" return arr; }
4 Réponses :
La troisième ligne de Utiliser char_arr_allocator () code> omise votre
MALLOC () code> Résultat et le remplace par une pièce de mémoire statique dans la page de données. Appelant
gratuit () code> sur ce coup. P>
str [n] cpy () code> Pour copier la chaîne littéral sur le tampon à la place. P>
Lorsque vous écrivez une chaîne constante en C, telle que traitement où Le numéro est une adresse. "xxxxxx" code>, que se passe-t-il est que cette chaîne va directement dans l'exécutable. Lorsque vous vous référez à votre source, il est remplacé par un pointeur sur cette mémoire. Afin que vous puissiez lire la ligne
ARR code> en tant que numéro comme quelque chose comme: p>
MALLOC CODE> a renvoyé une adresse différente et vous l'avez jetée lorsque vous avez attribué une nouvelle adresse à l'ARR. Vous obtenez un Segfault car vous essayez de libérer une chaîne constante qui est directement dans votre exécutable - vous ne l'avez jamais allouée. P> P>
Vous définissez Art code> à la valeur de retour de
MALLOC () code>, ce qui est correct. Mais vous la réaffectez ensuite pour pointer sur la constante de chaîne
"xxxxxxx" code>. Ainsi, lorsque vous appelez
gratuit () code>, vous demandez à l'exécution de libérer une constante de chaîne, ce qui provoque la défaillance de la SEG. P>
Vous allociez la mémoire à l'aide de alors vous faites ceci: p> Cela provoquera si vous souhaitez copier em> la chaîne dans l'utilisation de la mémoire allouée "code> strcpy code> comme: p> MALLOC code> correctement:
Art code> point sur l'adresse du littéral de chaîne
"xxxxxxx" code>, fuite em> strud> votre
Malloc code> Mémoire ED. Et aussi appeler
gratuit code> sur l'adresse de la chaîne littéral conduit à un comportement non défini. P>
Vous avez raison sur la partie UB: appeler gratuit code> avec n'importe quelle valeur de pointeur (autre que
null code>) non du
masloc code> ou
realloc code> donne un comportement non défini.
Regardez également hpl.hp.com/personal/hans_boehm/gcece/a > C'est vraiment sympa.