Correction gratuite de l'erreur de pointeur invalide en C
-
Ne pas
free
les pointeurs qui pointent vers des emplacements mémoire non dynamiques - Ne libérez pas les pointeurs qui ont déjà été libérés
Cet article présente plusieurs méthodes pour corriger l’erreur de pointeur invalide free
en C.
Ne pas free
les pointeurs qui pointent vers des emplacements mémoire non dynamiques
L’appel de fonction free
ne doit être utilisé que pour désallouer la mémoire des pointeurs qui ont été renvoyés par les fonctions malloc
, calloc
ou realloc
. Le code suivant montre le scénario dans lequel le pointeur char *
se voit attribuer une valeur retournée par l’appel malloc
, mais plus tard dans le bloc else
, le même pointeur est réaffecté avec une chaîne de caractères littérale. Cela signifie que la variable c_str
pointe vers l’emplacement qui n’est pas une région de mémoire dynamique ; ainsi, elle n’est pas autorisée à être passée à la fonction free
. En conséquence, lorsque l’exemple suivant est exécuté, et que le programme atteint l’appel de la fonction free
, il est interrompu, et free() : invalid pointer
error est affiché.
Notez qu’il ne faut pas réassigner les pointeurs à des emplacements mémoire dynamiques avec des adresses différentes, à moins qu’il n’y ait d’autres variables de pointeur qui pointent encore à l’emplacement d’origine. Enfin, vous ne devez appeler la fonction free
que sur les pointeurs qui pointent vers la mémoire de tas.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char *c_str = NULL;
size_t len;
if (argc != 2) {
printf("Usage: ./program string\n");
exit(EXIT_FAILURE);
}
if ((len = strlen(argv[1])) >= 4) {
c_str = (char *)malloc(len);
if (!c_str) {
perror("malloc");
}
strcpy(c_str, argv[1]);
printf("%s\n", c_str);
} else {
c_str = "Some Literal String";
printf("%s\n", c_str);
}
free(c_str);
exit(EXIT_SUCCESS);
}
Ne libérez pas les pointeurs qui ont déjà été libérés
Une autre erreur courante lors de l’utilisation de la mémoire dynamique est d’appeler la fonction free
sur les pointeurs qui ont déjà été libérés. Ce scénario est le plus probable lorsqu’il y a plusieurs variables de pointeurs pointant vers la même région de mémoire dynamique. L’exemple de code suivant illustre un de ces cas possibles, où le même emplacement est libéré dans différentes portées.
Notez que cet exemple est un programme court à fichier unique, et il sera facile de diagnostiquer un problème comme celui-ci, mais dans les bases de code plus importantes, il pourrait être difficile de suivre la source sans programmes d’inspection externes qui font une analyse statique.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char *c_str = NULL;
size_t len;
if (argc != 2) {
printf("Usage: ./program string\n");
exit(EXIT_FAILURE);
}
char *s = NULL;
if ((len = strlen(argv[1])) >= 4) {
c_str = (char *)malloc(len);
s = c_str;
if (!c_str) {
perror("malloc");
}
strcpy(c_str, argv[1]);
printf("%s\n", c_str);
free(c_str);
} else {
c_str = "Some Literal String";
printf("%s\n", c_str);
}
free(s);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook