Estoy tratando de aprender C y actualmente estoy tratando de escribir una estructura básica de pila de datos, pero parece que no puedo obtener el malloc
/free
básico correcto.Memoria libre asignada en una función diferente?
Aquí está el código que he estado usando (Estoy publicar una pequeña parte para ilustrar un problema específico, no el código total, pero el mensaje de error se generó sólo con la ejecución de este código de ejemplo en valgrind
)
#include <stdio.h>
#include <stdlib.h>
typedef struct Entry {
struct Entry *previous;
int value;
} Entry;
void destroyEntry(Entry entry);
int main(int argc, char *argv[])
{
Entry* apple;
apple = malloc(sizeof(Entry));
destroyEntry(*(apple));
return 0;
}
void destroyEntry(Entry entry)
{
Entry *entry_ptr = &entry;
free(entry_ptr);
return;
}
Cuando lo ejecuto a través valgrind
con --leak-check=full --track-origins=yes
, me sale el siguiente error:
==20674== Invalid free()/delete/delete[]/realloc()
==20674== at 0x4028E58: free (vg_replace_malloc.c:427)
==20674== by 0x80485B2: destroyEntry (testing.c:53)
==20674== by 0x8048477: main (testing.c:26)
==20674== Address 0xbecc0070 is on thread 1's stack
Creo que este error significa que la función destroyEntry
no está autorizado a modificar la memoria al ubicado explícitamente en main. ¿Está bien? ¿Por qué no puedo simplemente free
la memoria que asigné en main
en otra función? (¿y este comportamiento es de alguna manera específico del principal?)
+1 por pregunta clara y SSCCE. –
@MatteoItalia Nunca antes había oído hablar de [SSCCE] (http://sscce.org/). Definitivamente es un buen concepto. Gracias por presentarme a eso. –
Llamar por valor ??? –