Bonjour,
Je suis un peu rouillé sur la gestion de la mémoire en C visiblement, donc je viens demander votre aide.
J’ai le record suivant :
typedef struct dummy_t {
int value;
char * text1;
char * text2;
} dummy_t;
J’ai créé une petite stack en C me permettant uniquement d’ajouter des éléments au dessus (pas d’en retirer) :
typedef struct stack_t {
size_t capacity;
size_t size;
dummy_t * data;
} stack_t;
Trois petites fonctions lui sont associées :
void stack_initialize(stack_t * stack)
{
stack->capacity = VALUE_FROM_DEFINE; // La valeur définie est 8, on ne traite que deux éléments pour le moment donc pas de stack dynamique
stack->size = 0;
stack->data = (dummy_t*)malloc(VALUE_FROM_DEFINE * sizeof(dummy_t));
}
void stack_destroy(stack_t * stack)
{
for (size_t i = 0; i < stack->size; i++)
{
free(stack->data[i].text1);
stack->data[i].text1 = NULL;
free(stack->data[i].text2);
stack->data[i].text2 = NULL;
}
free(stack->data);
stack->data = NULL;
}
void stack_push(stack_t * stack, dummy_t * element)
{
stack->data[stack->size] = *element;
size_t length = strlen(element->text1) + 1;
stack->data[stack->size].text1 = (char*)malloc(length);
memcpy(&(stack->data[stack->size].text1), &element->text1, length);
length = strlen(element->text2) + 1;
stack->data[stack->size].text2 = (char*)malloc(length);
memcpy(&(stack->data[stack->size].text2), &element->text2, length);
stack->size++;
}
Je précise que ma stack est dynamique et peut donc s’agrandir, mais on ne rentre pas dans ce cas encore donc je le laisse de côté.
J’ai un objet stackt_t
global, initialisé au démarrage de l’application dans lequel l’utilisateur peut pousser des éléments dummy_t
quand il le souhaite :
void create_dummy(char * text1, char * text2)
{
dummy_t d;
d.value = 0;
d.text1 = text1;
d.text2 = text2;
stack_push(__global_buffer, &d);
}
J’ai cependant une erreur lors de stack_destroy
, il semblerait que je fasse un double free : double free or corruption (fasttop)
Je comprend mieux ce qu’il se passe lorsque je print les adresses, mes pointeurs dans mon tableau ont des adresses… originale :
[element 0] text1: 0x2124f50, text2: 0x2124f80, data: 0x2124030
[element 1] text1: 0x2124f80, text2: 0x2124f50, data: 0x2124030
text1
et text2
ont échangés les adresses vers quoi ils pointent ?? En effet quand je print les strings, ça n’a aucun sens.
Deux questions :
- Qu’est-ce qu’il se passe ?
- Comment réaliser ce que je veux faire en évitant au maximum les copies ? Je pensais m’en être plutôt bien sorti.
Merci pour vos réponses.