Programación General > C/C++
Error reservar memoria dentro funcion
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
[#] Página Siguiente
Ir a la versión completa