Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: safami85 en 13 Diciembre 2012, 22:21 PM

Título: malloc y free
Publicado por: safami85 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 (cpp) [Seleccionar]

main(){
double **matA;
set_matrix(6,6,matA);
free_mem(matA,6);

//Resevo el bloque de memoria
void set_matrix(int row, int col,double **matr){
matr = malloc(row * sizeof(double *));
for(int i = 0; i < row; i++){
matr[i] = malloc(col * sizeof(double));
}
}

//Libero el espacio
void free_mem(double **matr, int a){
for(int i=0;i<a;i++)
free(matr[i]);
free(matr);
}

Título: Re: malloc y free
Publicado por: x64core 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:




PULONG*   CustAllocate(  PULONG*   lppMain,
                        ULONG     x,
                        ULONG     y)
{
   
    lppMain = (PULONG*)malloc(x * sizeof(PULONG));
    for(int z = 0;z < x; z++)
         lppMain[z] = malloc(y * sizeof(PULONG));
   
    return lppMain;
}


PULONG*   CustFree( PULONG*   lppMain,
                   ULONG     x)
{
    for(int z = 0; z < x; z++)
         free(lppMain[z]);
   
    free((PULONG)lppMain);
    return lppMain;
}


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


Título: Re: malloc y free
Publicado por: naderST en 14 Diciembre 2012, 03:47 AM
Otra opción podría ser la siguiente:

#include <stdio.h>
#include <stdlib.h>
#define NUMERO_COLUMNAS 2

void * reservar_matriz(int m, int n)
{
    return malloc(sizeof(double)*m*n);
}

void liberar_matriz(void * matrizp)
{
    free(matrizp);
}

int main()
{
    /* Reserva una matriz de 10 filas por NUMERO_COLUMNAS columnas */
    double (*matriz)[NUMERO_COLUMNAS] = reservar_matriz(10,NUMERO_COLUMNAS);

    if(matriz == NULL)
    {
        fprintf(stderr, "Ocurrión algún problema con malloc()\n");
        return 1;
    }

    matriz[0][0] = 20.5;

    printf("%.1f\n", matriz[0][0]);

    liberar_matriz(matriz);

    return 0;
}
Título: Re: malloc y free
Publicado por: x64core 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
Título: Re: malloc y free
Publicado por: rir3760 en 14 Diciembre 2012, 15:23 PM
Cita de: x64Core en 14 Diciembre 2012, 00:13 AMTu 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:
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