Programación General > C/C++

 Error reservar memoria dentro funcion

(1/2) > >>

krnl64:
Hola amigos.
Estoy intentando reservar memoria para una variable externa a la función que la reserva.
Dentro de la función la reserva y la usa,pero al volver el codigo a donde hizo la llamada
falla.
Concretamente falla en la linea 17 de main.c
Por más que miro no sé donde está el fallo.
Pueden hecharme una mano ?
Gracias.

aleatorio.h

--- Código: C --- void alsr(int **vector, int inicio, int fin, int cuantos);  
aleatorio.c

--- Código: C --- #include<stdio.h>#include<stdlib.h>#include "aleatorio.h" void alsr(int **vector, int inicio, int fin, int cuantos){    int *temporal=NULL;    int i;    int j;    int pos;    int lon;      lon=fin-inicio;      /*Pedir memoria para temporal.*/    temporal=(int*)malloc(lon*sizeof(int));     if(temporal==NULL)        return;     for(i=0;i<lon;i++)    {        *(temporal+i)=inicio+i;     }     /*Pedir memoria array externo*/    *vector=(int*)malloc(cuantos*sizeof(int));    if(vector==NULL)        return;     /*Llenamos el vector de aleatorios*/    for(i=0;i<cuantos;i++)    {            /* Si tengo mas de un elemento */        if(cuantos > 1)        {            pos=rand()%lon;            /*Copio el elemento de esa posicion al original*/            *(vector+i)=*(temporal+pos);                    /*Realmente atrasamos el elemento del array*/            for(j=pos;j<lon-1;j++)                *(temporal+j)=*(temporal+j+1);             /*Vamos eliminando el ultimo elemento*/            lon--;                  temporal=(int*)realloc(temporal,lon*sizeof(int));        }        else        {                   *(vector+i)=*(temporal);        }     }      free(temporal);    temporal=0;     return;}  
main.c

--- Código: C --- #include <stdio.h>#include <stdlib.h>#include "aleatorio.h" #define cantidad 2 int main(int argc,char *argv[]){    int *tmp=0;    int i;     alsr(&tmp,1,5,cantidad);     for(i=0;i<cantidad;i++)    {        printf(" %d ",*(tmp+i));    }getchar();}   

Eternal Idol:
No mire mucho pero el compilador da dos warnings y esas lineas estan mal (C++ no compilaria esto  ^_^ ):
aleatorio.c(42) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int'
aleatorio.c(54) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int'

Lo depure rapidamente y tmp era un puntero hasta que llegue a la linea 42 y al ejecutarla se transformo en 2, al volver al main seguia teniendo ese valor.

PD. Esa manera se acceder a los arrays ya habras visto que no es la mas adecuada, cuesta leer el codigo y es facil equivocarse.

krnl64:
Cierto. No mire los warnings.

He sustituido el prototipo y el malloc por esto

--- Código: C --- void alsr(int *vector, int inicio, int fin, int cuantos);  
Linea 29 en aleatorio.c

--- Código: C --- vector=(int*)malloc(cuantos*sizeof(int));  
Entiendo que se queja de la indirección, pero ahora sigue fallando y no sé por qué ni cómo arreglarlo.
Ya no es un doble puntero.

Gracias

Eternal Idol:
En el codigo original en vector TODO lo que tenes es 1 la direccion de memoria de tmp y 2, en *vector, su contenido (0). Lo que pasa es que estas accediendo a vector[0], es decir el *tmp, tal cual lo dice el warning. Estas haciendo vector[0] = numero que es lo mismo que *tmp = numero.

Esto si pone el numero donde debe ir:

--- Código: C ---(*(*(vector+i)))=*(temporal+pos);//legible:*vector[i] = temporal[pos]; 
El problema es que no tenes mas lugar donde seguir poniendolos despues ... en cuanto i sea uno intentara acceder justo despues de la direccion de memoria de tmp como si fuera un puntero y boom.

Si no pasas la direccion de tmp (con **) esta seguira siendo 0 en main siempre y tal como estaba originalmente solo habia UN puntero.

krnl64:
Pude leer la explicación antes de que editaras.
Gracias Eternal.
Salu2

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa