Vector dinámico en c

davidpoza

Wenas, aqui sigo viendo cosillas en c y me ha surgido el siguiente problema en éste "programilla":

/* vectores dinámicos
que reservarán espacio en función de la dimensión que
especifiquemos*/
#include <stdio.h>
#include <stdlib.h>

int* reservar_memoria(int dim);
void lee_vector(int *vector, int dim);
void imprime_vector(int *vector, int dim);
void liberar_memoria(int *vector);

int main()
{
int vector;
int dim;
printf("Vectores dinámicos\n\n");
printf("Introduce la dimensión que tendrá: ");
scanf("%d", &dim);
lee_vector(vector, dim);
imprime_vector(vector, dim);
}
/
hace una reserva de memoria en función de la dimensión
que tendrá el vector y nos devuelve un puntero al inicio
del bloque de memoria que ha reservado/
int
reservar_memoria(int dim)
{
int *vector;
vector=(int )malloc(dimsizeof(int));
return vector;
}
void lee_vector(int *vector, int dim)
{
int i;
for (i=0; i<dim; i++)
{
printf("introduce el elemento %d: ", i+1);
scanf("%d", &vector);
}
return;
}

void imprime_vector(int *vector, int dim)
{
int i;
printf("El vector es: [");
for (i=0; i<dim; i++)
{
printf("%d", vector);
if (i+1<dim) printf(", ");
}
printf("]\n");
return;
}

void liberar_memoria(int *vector)
{
free(vector);
vector=NULL;
return;
}


Ejecuta correctamente:
Introduce la dimensión que tendrá: 7
introduce el elemento 1: 1
introduce el elemento 2: 2
introduce el elemento 3: 3
introduce el elemento 4: 4
introduce el elemento 5: 5
introduce el elemento 6: 6
introduce el elemento 7: 7

El vector es: [1, 2, 3, 4, 5, 6, 7]

Sin enbargo si introduzco enteros mayores me sucede esto:
Introduce la dimensión que tendrá: 3
introduce el elemento 1: 222
introduce el elemento 2: 666
introduce el elemento 3: 1
El vector es: [222, 666, 1]
9751:
9751: calling fini: /lib/tls/i686/cmov/libc.so.6 [0]
9751:
9751:
9751: runtime linker statistics:
9751: final number of relocations: 92

9751: final number of relocations from cache: 5

¿Dónde la estoy cagando? Porque nunca me habia salido nada parecido, y lo más curioso de todo es que el "error" o lo que sea lo da tras ejecutarse correctamente...

Gracias

B

Defines la función de reservar memoria pero nunca la utilizas... ¿?

Por cierto, es muy confuso el programa... ¿lee_vector no debería ser escribe_vector? Porque al principio me he rallado bastante con eso xD nada, cuestión de convención...

Por cierto, main a pesar de ser un int no devuelve nada... Ahí falta un return 0. Quizá sea eso.

Lo único que tengo claro es que el error lo da en alguna de las funciones de la librería de C de GNU... ¿printf quizá? ¿return? No sé... Prueba a debuggearlo con GDB o algo de eso...

javithelong

La liberacion no hace exactamente lo que quieres, pero weno, esta decente (el vector no quedará apuntando a NULL, aunque si este liberado, tendrás un puntero loco ahi que puede darte problemas si luego lo usas para algo).

Asi viendo por encima, mira el scanf al meter los datos, pon &(vector) por si acaso, no se si funcionará porque no recuerdo el orden de preferencia de operadores & y [], pero weno, mira a ver si es eso

Sino ya miro esta noche, que ara ando liao. Saludos

maRc

El principal problema es que no reservas el espacio, no hay niguna llamada a reservar_memoria.

También deberías ponerle un return 0 al main (aunque eso no es problema de que no funcione), en las funciones que no devuelven nada (las void), no hace falta que pongas el return, y ese "vector = NULL" en liberara_memoria no sirve para nada.

davidpoza

ok, creo que ya lo he corregido.
Y la verdad es que no se como se me ha podido pasar el usar las funciones de reservar y liberar, yo miraba y lo veia bien :P, es que no se qué estaría pensando...

/* vectores dinámicos
que reservarán espacio en función de la dimensión que
especifiquemos*/
#include <stdio.h>
#include <stdlib.h>

int* reservar_memoria(int dim);
void lee_vector(int *vector, int dim);
void imprime_vector(int *vector, int dim);
void liberar_memoria(int *vector);

int main()
{
int vector;
int dim;
printf("Vectores dinámicos\n\n");
printf("Introduce la dimensión que tendrá: ");
scanf("%d", &dim);
vector=reservar_memoria(dim);
lee_vector(vector, dim);
imprime_vector(vector, dim);
liberar_memoria(vector);
return 0;
}
/
hace una reserva de memoria en función de la dimensión
que tendrá el vector y nos devuelve un puntero al inicio
del bloque de memoria que ha reservado/
int
reservar_memoria(int dim)
{
int *vector;
vector=(int )malloc(dimsizeof(int));
return vector;
}
void lee_vector(int *vector, int dim)
{
int i;
for (i=0; i<dim; i++)
{
printf("introduce el elemento %d: ", i+1);
scanf("%d", &vector);
}
}

void imprime_vector(int *vector, int dim)
{
int i;
printf("El vector es: [");
for (i=0; i<dim; i++)
{
printf("%d", vector);
if (i+1<dim) printf(", ");
}
printf("]\n");
}

void liberar_memoria(int *vector)
{
free(vector);
}


Introduce la dimensión que tendrá: 4
introduce el elemento 1: 343434
introduce el elemento 2: 31321
introduce el elemento 3: 4252
introduce el elemento 4: 5
El vector es: [343434, 31321, 4252, 5]

Usuarios habituales

  • davidpoza
  • maRc
  • javithelong
  • bLiNk_RuLe2