[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