malloc y free

Iniciado por safami85, 13 Diciembre 2012, 22:21 PM

0 Miembros y 1 Visitante están viendo este tema.

safami85

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);
}


x64core

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.



naderST

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;
}

x64core

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

rir3760

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
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