[C con Clase] Uso de malloc y free

marcelinux marcelinator en gmail.com
Mie Nov 18 22:27:04 CET 2015


Hola, de nuevo. Siento el retraso en contestar.
He probado a sustituir la llamada a la función manejo para que, en lugar de constante, le paso una variable, tal como indica Diego.
El resultado es la versión 3.

/* Uso de malloc y liberación con free */
/* Versión 3. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *manejo(char *param);

int main()
{
	char *cadenaA = (char *)malloc(80 * sizeof(char));
	char *cadenaB = (char *)malloc(80 * sizeof(char));
	char *cadenaC = (char *)malloc(80 * sizeof(char));
	strcpy(cadenaC, "Contenido de A");
	cadenaA = manejo(cadenaC);
	printf("\nCadena A: %s", cadenaA);
	strcpy(cadenaC, "Contenido de B");
	cadenaB = manejo(cadenaC);
	printf("\nCadena B: %s\n", cadenaB);
	free(cadenaA);
	free(cadenaB);
	cadenaA=NULL;
	cadenaB=NULL;
}

char *manejo(char *param)
{
	return param;
}

Entonces es cuando he descubierto, con ayuda del Debug GDB, que la función manejo, modifica la dirección del puntero "receptor" y le asigna a ambos el de cadenaC.
Por eso se produce el error al liberar el segundo puntero.
Eso me llevó a copiar el argumento en una variable local dentro de "manejo", tal como apunta David.

char *manejo(char *param)
{
	size_t longitud = strlen(param);
	char *resultado = (char *)malloc(longitud);
	strncpy(resultado, param, longitud);
	return resultado;
}

Y así es como conseguí lo que me proponía.
Gracias también a Alejandro por su aclaración.

Quedo muy agradecido por mantener esta lista de correo, la web y los cursos.
Espero poder devolver el favor algún día.


Sólo necesito aprender un poquito más. Gracias por tu ayuda.


Más información sobre la lista de distribución Cconclase