C/Visual C - Error al liberar memoria con free

 
Vista:

Error al liberar memoria con free

Publicado por races (25 intervenciones) el 24/02/2006 16:50:54
Hola amigos me encuentro con el siguiente problema, estoy utilizando variables las cuales introduzco por parámetro, para ello reservo memoria mediante malloc cuando intento liberar memoria me da un pantallazo en el cual me dice DAMAGE: after normal block #36

A que puede ser debido esto y como solucionarlo, muestro un código ejemplo que me ocurre lo mismo. Compilo con Visual Studio 6.0

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char * a = NULL;
char * b = NULL;
char * c = NULL;

void main(int argc, char * argv[])
{

if(argc == 3)
{
a = (char *)malloc(strlen(argv[1]));
b = (char *)malloc(strlen(argv[2]));

strcpy(a,argv[1]);
strcpy(b,argv[2]);

a[strlen(a)] = '\0';
b[strlen(b)] = '\0';

}
else
{
return;
}

printf("A --> %s\n",a);
printf("B --> %s\n",b);

c = (char *)malloc(strlen(a) + strlen(b));

printf("CONCATENANDO\n");
strcpy(c,a);
strcat(c," y ");
strcat(c,b);

printf("LIBERANDO MEMORIA\n");
// Aqui sale el error
free(a);
free(b);
a = NULL;
b = NULL;

printf("C --> %s\n",c);
}

GRACIAS POR VUESTRA AYUDA. UN SALUDO ATENTAMENTE
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error al liberar memoria con free

Publicado por kero (45 intervenciones) el 24/02/2006 23:09:56
Para encontrar el error te recomiendo debugearlo con alguna herramienta de debug. Tambien podes correr el programa con memusage para saber exactamente como estas manejando la memoria y poder sacar algun dato de que es lo que esta mal. Suerte

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Error al liberar memoria con free

Publicado por chuidiang (73 intervenciones) el 25/02/2006 06:06:21
Hola:

Supon que argv[1] contiene "hola". La longitud strlen de argv[1] es 4. Sin embargo contiene 5 caracteres, los cuatro de "hola" más el \0 del final.
Si quires copiarlo, debes reservar 5 caracteres, es decir

a = (char *)malloc(strlen(argv[1])+1);

Al hacer el strcpy() también se copia el \0, asi que antes estabas "machacando" con un \0 una zona de memoria que no estaba fuera de lo que habias reservado. Esto justifica el error en los free() o cualquier otra cosa imprevista

Algo como a[strenlen(a)]=0 es redundante. strelen() mira la longitud de la cadena buscando el \0, es decir, si strelen() funciona, es porque el \0 ya está puesto.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar