[C con Clase] Uso de malloc y free

Miguel Alejandro Jimenez Ramirez cerberbero en gmail.com
Lun Nov 16 08:57:53 CET 2015


Hola Marcelinux

bueno primero que todo para responder tu pregunta hay varias cosas que
tienes que tener en cuenta. El uso de la funcion Malloc lo que hace es
asignar a un espacio de memoria un tamaño determinado entonces dicho
esto si tienes :

char *cadenaA = (char *)malloc(80 * sizeof(char));

Significa que a la referencia CadenaA que esta apuntando a un espacio
de memoria tipo char le estas asignando un espacio de memoria de 80
veces el valor en bytes de una variable tipo char char. es decir 80
bytes

Lo mismo pasa con CadenaB

Cuando utilizas la funcion strcpy lo que estas haciendo es que tomas
la cadena fuente y la copias en el espacio de memoria donde tienes el
puntero de tu destinacion , incluyes el caracter NULL para saber que
terminaste de copiar toda la cadena de caracteres o string.

Luego con free lo unico que haces es liberar ese espacio de memoria
para que pueda utilizarse por algun otro programa y por ultimo borras
el contenido de cada una de las cadenas.

Con esto dicho , en la segunda version lo que haces es que a una
referencia CadenaA o CadenaB le estas dando un espacio de memoria mas
grande del que pueda soportar.Entonces en las lineas

cadenaA = manejo("Contenido de A");
y
cadenaB = manejo("Contenido de B");

La funcion manejo() esta retornando un valor mas grande de lo que
pueda ocupar en la referencia cadenaA y cadenaB. Por lo tanto tienes
que revisar lo que estas asignandole a estos espacios de memoria.
Yo te aconsejo que revises lo que estas retornando en esta funcion y
que estes segura que no sobrepase el valor que le asignas a esta
referencia con malloc.

Por que en realidad el problema no es la utilizacion de free o malloc,
es mas bien entender lo que hacen estas funciones y por que se asignan
de estas forma. Siempre que tengas un error de violacion de segmento
es por que no estas respetando el espacio de memoria o el segmento
asignado a una referencia determinanda.

espero haber podido ayudarte , buen dia para ti.


2015-11-15 20:33 GMT+01:00 marcelinux <marcelinator en gmail.com>:
> Hola. Tengo una duda con el uso de free.
> Tengo dos aplicaciones que hacen lo mismo excepto por la forma de almacenar el contenido en un array.
> Si uso strcpy, free me libera sin problemas.
> Sin embargo, si uso una función "propia", me produce una "Violación de segmento".
> ¿Qué me falta?
>
> Estas son las dos versiones del programa. La versión 2 es la del error.
>
> <code>/* Uso de malloc y liberación con free */
> /* Versión 1. */
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> int main()
> {
>         char *cadenaA = (char *)malloc(80 * sizeof(char));
>         char *cadenaB = (char *)malloc(80 * sizeof(char));
>         strcpy(cadenaA, "Contenido de A");
>         strcpy(cadenaB, "Contenido de B");
>         printf("\nCadena A: %s", cadenaA);
>         printf("\nCadena B: %s\n", cadenaB);
>         free(cadenaA);
>         free(cadenaB);
>         cadenaA=NULL;
>         cadenaB=NULL;
> }
>
> /* Uso de malloc y liberación con free */
> /* Versión 2. */
> #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));
>         cadenaA = manejo("Contenido de A");
>         printf("\nCadena A: %s", cadenaA);
>         cadenaB = manejo("Contenido de B");
>         printf("\nCadena B: %s\n", cadenaB);
>         free(cadenaA);
>         free(cadenaB);
>         cadenaA=NULL;
>         cadenaB=NULL;
> }
>
> char *manejo(char *param)
> {
>         return param;
> }
> </code>
>
> Sólo necesito aprender un poquito más. Gracias por tu ayuda.
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ



-- 
ALEJANDRO JIMENEZ




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