“Le pointeur libéré n’a pas été atsortingbué.” Erreur après malloc, realloc

J’ai cette erreur avec le code suivant:

int main(){ point *points = malloc(sizeof(point)); if (points == NULL){ printf("Memory allocation failed.\n"); return 1; } other_stuff(points); free(points); return 0; } void other_stuff(point points[]){ //stuff realloc(points, number*sizeof(point)) } 

J’ai cherché, mais n’ai trouvé que des exemples où il était clair qu’il n’y avait pas d’allocation.

Ici, j’ai utilisé malloc pour initialiser des points , puis j’ai changé sa taille avec realloc ; Alors, comment est le pointeur “non alloué” quand je viens de le free ?

realloc peut déplacer la mémoire vers un nouvel emplacement (s’il n’y a pas assez d’espace pour développer l’ancien pointeur). Si cela se produit, vous devez libérer le nouveau pointeur.

Essayez ce tweak:

 int main(){ point *points = malloc(sizeof(point)); if (points == NULL){ printf("Memory allocation failed.\n"); return 1; } other_stuff(&points); free(points); return 0; } void other_stuff(point **points){ //stuff point *temp = realloc(*points, number*sizeof(point)); if(temp != NULL) { *points = temp; // and do your stuff } else { // panic? memory reallocation failed. Deal with it gracefully. } } 

En passant un handle à other_stuff , nous lui donnons le contrôle non seulement sur l’endroit où le pointeur pointe, mais également sur l’adresse du pointeur lui-même. Cela lui permet de déplacer la mémoire. Les poignées sont un bon moyen de gérer la mémoire de manière dynamic. mais conceptuellement, un pointeur sur un pointeur prend un certain temps pour s’y habituer …

realloc renvoie un nouveau pointeur. C’est ce que vous devez libérer (éventuellement) si la fonction a réussi. Sinon, cela a échoué et vous conservez l’ancien pointeur pour ce cas.

Comment utiliser realloc :

 whataver *f = malloc(count * sizeof(*f)); /* ... */ whatever *temp = realloc(f, new_count * sizeof(*temp)); if (temp) f = temp; // realloc worked, f is no longer valid/needed else free(f); // error 

realloc peut renvoyer le même pointeur ou non. Le fait est que vous ne vous souciez plus du pointeur d’origine si realloc réussi. S’il devait atsortingbuer un nouveau bloc, le pointeur d’origine n’est pas valide. Si ce n’est pas le cas, le même pointeur est renvoyé et vous ne voulez certainement pas le désaffecter immédiatement.

Merci pour la solution: realloc (PEUT) renvoyer un NOUVEAU pointeur.

De plus, je pense que ce qui suit peut aider:

 int main(){ point *points = malloc(sizeof(point)); if (points == NULL){ printf("Memory allocation failed.\n"); return 1; } other_stuff(&points); /* Send address of points */ free(points); return 0; } void other_stuff(point (*ppoints)[]){ //stuff realloc(*ppoints, number*sizeof(point)) /* If a new storage area is assigned by realloc the original points location will be updated in main */ 

}