7
votes

Malloc, faute de la segmentation et de segmentation

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 :


2
votes

La troisième ligne de char_arr_allocator () omise votre MALLOC () Résultat et le remplace par une pièce de mémoire statique dans la page de données. Appelant gratuit () sur ce coup.

Utiliser str [n] cpy () Pour copier la chaîne littéral sur le tampon à la place.


0 commentaires

2
votes

Lorsque vous écrivez une chaîne constante en C, telle que "xxxxxx" , 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 xxx

traitement ARR en tant que numéro comme quelque chose comme: xxx

où Le numéro est une adresse. MALLOC 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.


0 commentaires

0
votes

Vous définissez Art à la valeur de retour de MALLOC () , ce qui est correct. Mais vous la réaffectez ensuite pour pointer sur la constante de chaîne "xxxxxxx" . Ainsi, lorsque vous appelez gratuit () , vous demandez à l'exécution de libérer une constante de chaîne, ce qui provoque la défaillance de la SEG.


0 commentaires

16
votes

Vous allociez la mémoire à l'aide de MALLOC correctement: xxx

alors vous faites ceci: xxx

Cela provoquera Art point sur l'adresse du littéral de chaîne "xxxxxxx" , fuite votre Malloc Mémoire ED. Et aussi appeler gratuit sur l'adresse de la chaîne littéral conduit à un comportement non défini.

si vous souhaitez copier la chaîne dans l'utilisation de la mémoire allouée "code> strcpy comme: xxx


1 commentaires

Vous avez raison sur la partie UB: appeler gratuit avec n'importe quelle valeur de pointeur (autre que null ) non du masloc ou realloc donne un comportement non défini.