Foros del Web » Programación para mayores de 30 ;) » C/C++ »

error en asignacion de memoria dinamica

Estas en el tema de error en asignacion de memoria dinamica en el foro de C/C++ en Foros del Web. Hola, el siguiente codigo de asignacion de memoria dinamica me da un error de ejecución y no sé por qué es. #include <stdio.h> #include <stdlib.h> ...
  #1 (permalink)  
Antiguo 10/05/2006, 02:20
 
Fecha de Ingreso: mayo-2006
Mensajes: 2
Antigüedad: 18 años, 7 meses
Puntos: 0
error en asignacion de memoria dinamica

Hola, el siguiente codigo de asignacion de memoria dinamica me da un error de ejecución y no sé por qué es.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


main ()
{
int i, lon;

char **vector;

char palabra[15];

vector=(char**)malloc(sizeof(char*));
gets(palabra);
lon=strlen(palabra)+1;
vector[0]=(char*)malloc(lon*sizeof(char));
strcpy(vector[0], palabra);
puts(vector[0]);
for (i=1;i<3;i++)
{
gets(palabra);
lon=strlen(palabra)+1;
vector=(char**)realloc(vector,i*sizeof(char*));
vector[i]=(char*)malloc(lon*sizeof(char));
strcpy(vector[i], palabra);
puts(vector[i]);

}

for (i=0;i<10;i++)
{
puts(vector[i]);
}

return 0;
}


Graciñas.
Marta
  #2 (permalink)  
Antiguo 10/05/2006, 10:51
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
solo veo 2 errores, como en la remimencion de tu vector,
ya que redimecionas empezando por 1, cuando supongo que lo que quieres es mantener la primer cadena. lo correcto seria redimencionar 2,3,4,etc

el otro error es querer acceder a vectores no creados.
dentro del ultimo for usas como limite del bucle 10 cuando seria 3.

la otra es que no liberaste la memoria.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main ()
{
int i, lon;

char **vector;

char palabra[15];

vector=(char**)malloc(sizeof(char*));
gets(palabra);
lon=strlen(palabra)+1;
vector[0]=(char*)malloc(lon*sizeof(char));
strcpy(vector[0], palabra);
puts(vector[0]);

for (i=1;i<3;i++)
{
gets(palabra);
lon=strlen(palabra)+1;
vector=(char**)realloc(vector,(i+1)*sizeof(char*)) ;//Si lo que quieres es aumentar una cadena mas es redimencionar a 2
vector[i]=(char*)malloc(lon*sizeof(char));
strcpy(vector[i], palabra);
puts(vector[i]);
}

for (i=0;i<3;i++)// No puedes acceder a vecotes no recervados, solo tienes 3.
{
puts(vector[i]);
free(vector[i]);
}
free(vector);
return 0;
}

Saludos
  #3 (permalink)  
Antiguo 10/05/2006, 11:55
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Cita:
solo veo 2 errores, como en la remimencion de tu vector,
ya que redimecionas empezando por 1, cuando supongo que lo que quieres es mantener la primer cadena. lo correcto seria redimencionar 2,3,4,etc

el otro error es querer acceder a vectores no creados.
dentro del ultimo for usas como limite del bucle 10 cuando seria 3.

la otra es que no liberaste la memoria.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main ()
{
int i, lon;

char **vector;

char palabra[15];

vector=(char**)malloc(sizeof(char*));
gets(palabra);
lon=strlen(palabra)+1;
vector[0]=(char*)malloc(lon*sizeof(char));
strcpy(vector[0], palabra);
puts(vector[0]);

for (i=1;i<3;i++)
{
gets(palabra);
lon=strlen(palabra)+1;
vector=(char**)realloc(vector,(i+1)*sizeof(char*)) ;//Si lo que quieres es aumentar una cadena mas es redimencionar a 2
vector[i]=(char*)malloc(lon*sizeof(char));
strcpy(vector[i], palabra);
puts(vector[i]);
}

for (i=0;i<3;i++)// No puedes acceder a vecotes no recervados, solo tienes 3.
{
puts(vector[i]);
free(vector[i]);
}
free(vector);
return 0;
}

Saludos
En si estas en lo correcto, pero que es lo que intentas hacer con realloc? yo no le veo sentido, ya que estas usando una lista de punteros. Seria mas eficiente hacer un malloc, con el numero de punteros que necesites, o en caso de que sea mas dinamico, una buena lista enlazada. Es mas sano.
Saludos
  #4 (permalink)  
Antiguo 11/05/2006, 05:39
 
Fecha de Ingreso: mayo-2006
Mensajes: 2
Antigüedad: 18 años, 7 meses
Puntos: 0
gracias

Gracias

Tenias razón pq si queria guardar la informacion de la primera celda.

Lo hago asi pq es lo q me piden como ejercicio en clase de practicas de asignacion de memoria aunq es mucho mas logico hacerlo como tu dices
  #5 (permalink)  
Antiguo 11/05/2006, 19:09
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
No hay de que, alguna duda mas, nos avisas.
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:59.