Erreur lors de la libération de mémoire en C

J’ai écrit un problème pour pratiquer les pointeurs et allouer de la mémoire.

Cependant, je reçois un vidage de stack lorsque je libère la mémoire. Est-ce que je libère au bon endroit? Y at-il quelque chose de mal avec mon programme qui pourrait le rendre dangereux?

void display_names(char **names_to_display, char **output); int main(void) { char *names[] = {"Luke", "John", "Peter", 0}; char **my_names = names; char *new_output[1024] = {0}; size_t i = 0; // Print the ordinal names while(*my_names) { printf("Name: %s\n", *my_names++); } my_names = names; /* Reset */ display_names(my_names, new_output); // Print the updated names while(new_output[i]) { printf("Full names: %s\n", new_output[i]); i++; } // Free allocated memory free(new_output); getchar(); return 0; } void display_names(char **names_to_display, char **output) { while(*names_to_display) { *output = (char*) malloc(strlen("FullName: ") + strlen(*names_to_display) + 1); if(!*output) { fprintf(stderr, "Cannot allocate memory"); exit(1); } // Copy new output sprintf(*output, "FullName: %s", *names_to_display++); printf("display_names(): Name: %s\n", *output++); } } 

Vous n’avez pas alloué la mémoire pour new_output, elle a été allouée par le compilateur. free est à utiliser lorsque vous malloc mémoire au moment de l’exécution, pas pour libérer de la mémoire allouée par le compilateur au moment de la compilation.

Votre new_output est une variable locale et sera “publiée” quand elle sortira du champ d’application, c’est-à-dire à la fin du croisement de la fonction dans laquelle elle est déclarée.

la déclaration de char * new_display [1024] signifie que vous déclarez un tableau de 1024 éléments, chaque élément étant un pointeur sur char. Le tableau lui-même est alloué statiquement ici, un tableau de 1024 éléments sera réservé sur la stack. Dans votre exemple, vous renseignez les entrées de ce tableau en allouant de la mémoire à l’aide de malloc et en définissant chaque élément du tableau. Il s’agit de la mémoire que vous devez libérer, et non du tableau alloué statiquement.

Ainsi, au lieu d’appeler free (new_display), vous devrez parcourir les entrées du tableau et faire free (new_display [i]), de cette façon vous ne libérez que ce que vous avez alloué.

Votre problème est que lorsque vous dites:

 free(new_output); 

new_output est un tableau sur la stack. Il n’a pas été alloué avec malloc (), vous ne pouvez donc pas le libérer avec free (). Vous devez libérer les pointeurs new_output dans new_output .