elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  malloc y free
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: malloc y free  (Leído 2,301 veces)
safami85

Desconectado Desconectado

Mensajes: 1


Ver Perfil
malloc y free
« en: 13 Diciembre 2012, 22:21 pm »

Buenas gente! les comento rapidito y espero que de forma clara un problemita que me esta llevando ya un par de dias resolver:
Estoy trabajando con varias matrices dinamicas, usando las funciones malloc y free. Logre reservar el espacio de memoria con malloc y liberarlo con free pero esto siempre dentro de mi funcion principal main(). Como tengo que realizar muchas operaciones con las matrices (sumas, multiplicaciones, etc.) decidi hacer dos funciones, una para "generar" las matrices con malloc y otra funcion para "liberarlas" usando free. El tema es que el programa (que lo cargo en un microcontrolador) no puedo hacerlo funcionar de esta ultima manera. Alguien podria decirme de que forma deberia usar malloc y free en dos funciones diferentes sin problemas?
Parte del codigo que estoy usando:(Hay cosas que saque por simplicidad)
Código
  1. main(){
  2. double **matA;
  3. set_matrix(6,6,matA);
  4. free_mem(matA,6);
  5.  
  6. //Resevo el bloque de memoria
  7. void set_matrix(int row, int col,double **matr){
  8. matr = malloc(row * sizeof(double *));
  9. for(int i = 0; i < row; i++){
  10. matr[i] = malloc(col * sizeof(double));
  11. }
  12. }
  13.  
  14. //Libero el espacio
  15. void free_mem(double **matr, int a){
  16. for(int i=0;i<a;i++)
  17. free(matr[i]);
  18. free(matr);
  19. }
  20.  
  21.  


« Última modificación: 14 Diciembre 2012, 03:57 am por simorg » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: malloc y free
« Respuesta #1 en: 14 Diciembre 2012, 00:13 am »

Tu código es incorrecto, estas asignando un nuevo array de X cantidad y almacenas el puntero a tal memoria
en la mismo espacio de memoria, lo que buscas es esto:




Código
  1. PULONG*   CustAllocate(  PULONG*   lppMain,
  2.                         ULONG     x,
  3.                         ULONG     y)
  4. {
  5.  
  6.     lppMain = (PULONG*)malloc(x * sizeof(PULONG));
  7.     for(int z = 0;z < x; z++)
  8.          lppMain[z] = malloc(y * sizeof(PULONG));
  9.  
  10.     return lppMain;
  11. }
  12.  
  13.  
  14. PULONG*   CustFree( PULONG*   lppMain,
  15.                    ULONG     x)
  16. {
  17.     for(int z = 0; z < x; z++)
  18.          free(lppMain[z]);
  19.  
  20.     free((PULONG)lppMain);
  21.     return lppMain;
  22. }

Y si piensas trabajar en Windows, entonces es mejor usar la W32 que la libreria(s) de VC.




En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: malloc y free
« Respuesta #2 en: 14 Diciembre 2012, 03:47 am »

Otra opción podría ser la siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUMERO_COLUMNAS 2
  4.  
  5. void * reservar_matriz(int m, int n)
  6. {
  7.    return malloc(sizeof(double)*m*n);
  8. }
  9.  
  10. void liberar_matriz(void * matrizp)
  11. {
  12.    free(matrizp);
  13. }
  14.  
  15. int main()
  16. {
  17.    /* Reserva una matriz de 10 filas por NUMERO_COLUMNAS columnas */
  18.    double (*matriz)[NUMERO_COLUMNAS] = reservar_matriz(10,NUMERO_COLUMNAS);
  19.  
  20.    if(matriz == NULL)
  21.    {
  22.        fprintf(stderr, "Ocurrión algún problema con malloc()\n");
  23.        return 1;
  24.    }
  25.  
  26.    matriz[0][0] = 20.5;
  27.  
  28.    printf("%.1f\n", matriz[0][0]);
  29.  
  30.    liberar_matriz(matriz);
  31.  
  32.    return 0;
  33. }
  34.  
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: malloc y free
« Respuesta #3 en: 14 Diciembre 2012, 09:26 am »

Hay algunos diferencias en los códigos, el ejemplo de naderST la memoria asignada es de uno solo espacio de memoria, y es semi-dinamica, la columna es constante, no puede cambiar de longitud. Además no es posible liberar memoria de un index del array determinado, debido a que si se libera un puntero del array que en realidad es un puntero al mismo bloque de memoria asignada más un offset y luego al intentar el puntero principal generar una exception.  ;D
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: malloc y free
« Respuesta #4 en: 14 Diciembre 2012, 15:23 pm »

Tu código es incorrecto, estas asignando un nuevo array de X cantidad y almacenas el puntero a tal memoria en la mismo espacio de memoria
Sin animo de ofender pero, honestamente, no entiendo esa explicación.

El problema que se describe en el primer mensaje se debe a que en C todo se pasa por valor, cuando se realiza la llamada:
Código
  1. set_matrix(6,6,matA);
La función recibe los argumentos 6, 6 y el valor almacenado en la variable "matA", ellos son utilizados para inicializar cada uno de los parámetros. Como todas las operaciones en la mentada función se realizan en los parámetros y como estos son variables locales los cambios no afectaran a la variable utilizada en la llamada ("matA" de main).

Para solucionarlo se debe emular el paso por referencia pasando la dirección del objeto que desee modificarse mas los otros cambios necesarios (en el prototipo y definición).

Ya esta solucionado (en otro foro).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Malloc ... « 1 2 »
Programación C/C++
roser24 14 6,840 Último mensaje 5 Mayo 2010, 21:15 pm
por Akai
Debian 6.0 free y non-free. Tú eliges
Noticias
wolfbcn 2 2,788 Último mensaje 16 Diciembre 2010, 19:26 pm
por do-while
Dudas con malloc...
Programación C/C++
Metal-byte 2 2,026 Último mensaje 1 Enero 2012, 16:15 pm
por Metal-byte
Error en malloc()
Programación C/C++
soyloqbuskas 8 5,258 Último mensaje 11 Noviembre 2012, 20:18 pm
por Foxy Rider
Segmentacion Fault al llamar a la funcion free con un puntero creado con malloc
Programación C/C++
Gallu 2 2,376 Último mensaje 1 Noviembre 2017, 20:21 pm
por Gallu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines