malloc dentro de una funcion

Iniciado por erest0r, 18 Diciembre 2013, 18:19 PM

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

erest0r

Voy directo al codigo:

Código (cpp) [Seleccionar]

void generar( int **arreglo, int fil, int col )
{
    int i;

    arreglo = (int **)malloc(fil*sizeof(int *));

    for( i = 0; i < fil; i++ )
        arreglo[i] = (int *)malloc(col * sizeof(int));

}


Ok, luego de haber generado mi arreglo multidimensional y lo quiero mostrar con un ciclo dentro del main, los valores no se muestran sino que sale un error de windows, en cambio si muestro los valores dentro de la misma funcion, si lo hace. Imagino que se deben crear variables temporales solamente dentro de la funcion y por eso no se muestran en el main, y quisiera saber si existe una manera de poder reservar esa memoria y mostrarla en main.

Gracias
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

rir3760

Cuando tengas una duda o problema con alguno de tus programas por favor indica el lenguaje de programación.

En cuanto a la causa del error es la que comentas:
Cita de: erest0r en 18 Diciembre 2013, 18:19 PMImagino que se deben crear variables temporales solamente dentro de la funcion y por eso no se muestran en el main

Como resolverlo depende del lenguaje, en el caso de C++ lo mas fácil es utilizando una referencia, un ejemplo de ello:
Código (cpp) [Seleccionar]
void generar(int**& arreglo, int fil, int col )
{
   arreglo = (int**) malloc(fil * sizeof(int *));
   for (int i = 0; i != fil; ++i)
      arreglo[i] = (int*) malloc(col * sizeof(int));
}

También se debe remplazar el uso de malloc por el operador new (y free por delete).

----

En el caso de C bien pasas un puntero a la variable (tipo "int ***") o, la mas sencilla, modificas la función para que retorne la dirección del bloque principal:
#include <stdio.h>
#include <stdlib.h>

int **generar(int fil, int col);

int main(void)
{
   int **mat;
   
   /* ... */
   
   mat = generar(10, 20);
   
   /* ... */
   
   return EXIT_SUCCESS;
}

int **generar(int fil, int col)
{
   int **mat;
   int i;
   
   mat = malloc(fil * sizeof *mat);
   for (i = 0; i < fil; i++)
      mat[i] = malloc(col * sizeof *mat[i]);
   
   return mat;
}


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

erest0r

Gracias amigo, es en C el problema, no incluí el tipo de lenguaje, por como la sección del foro es C/C++ pense que se sobrentendia
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.