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.