Ayuda asignacion de memoria dinámica palabras en c

Iniciado por newfag, 18 Mayo 2010, 16:30 PM

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

newfag

buenas, tengo un problemilla, quiero hacer un programa que acepte un numero indeterminado de palabras y las imprima por pantalla(esto último solo para ver si funciona), había pensado algo así pero no va, una ayudita por favor

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

main()
{
int n,i;
char *vect;                       
printf("Nº palabras: ");
scanf("%d" ,&n);

vect=(char *)calloc(sizeof(char),n);
for(i=0;i<n;i++)
  {
  printf("palabra: ");
  scanf("%s" ,vect[i]);
  }
for(i=0;i<n;i++)
printf("%s\n", vect[i]);
}



Eternal Idol

Ahi estas reservando memoria para una sola palabra de n caracteres  ;)
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

newfag

#2
Cita de: Eternal Idol en 18 Mayo 2010, 16:38 PM
Ahi estas reservando memoria para una sola palabra de n caracteres  ;)
ala es verdad!!!
vale, me pongo a ello, muchas gracias

EI: juntando mensajes.

arreglado, por si alguien le sirve de ayuda aqui lo dejo
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
int n,i;
char **vect;
printf("Nº palabras: ");
scanf("%d" ,&n);

vect=(char **)calloc(sizeof(char*),n);
for(i=0;i<n;i++)
vect[i]=(char*)malloc(sizeof(char)*50);

for(i=0;i<n;i++)
  {
  printf("palabra: ");
  scanf("%s" ,vect[i]);
  }
  for(i=0;i<n;i++)
  printf("%s\n", vect[i]);
}

Gallu

No te parece que estás "mal gastando " memoria ?  que sucede cuando la palabra ingresada no es de 50 caracteres , en todo caso 50 caracteres ya me suena a frase , quedaría mejor si reservas la memoria necesaria para el tamaño especifico de cada palabra ... :-\
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

newfag

#4
Cita de: Didacso en 18 Mayo 2010, 17:17 PM
No te parece que estás "mal gastando " memoria ?  que sucede cuando la palabra ingresada no es de 50 caracteres , en todo caso 50 caracteres ya me suena a frase , quedaría mejor si reservas la memoria necesaria para el tamaño especifico de cada palabra ... :-\


hmm tienes razón, quedaría algo así, pero no se me ocurre otra manera de hacerlo que poner una variable auxiliar de 20 caracteres :S
EDIT: al usar la funcion strlen lo se incluye el terminador de la cadena, por eso pongo strlen(aux)+1

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

main()
{
int n,i;
char **vect,aux[20];
printf("Nº palabras: ");
scanf("%d" ,&n);

vect=(char **)calloc(sizeof(char*),n);
for(i=0;i<n;i++)
 {
 printf("palabra: ");
 scanf("%s" ,aux);
 vect[i]=(char*)malloc(sizeof(char)*(strlen(aux)+1));
 strcpy(vect[i],aux);
 }

for(i=0;i<n;i++)
printf("%s\n", vect[i]);
}

Gallu

Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica

char *aux = (char *) malloc(sizeof(char)*20);

al final solo tendrías que liberar toda la memoria que pediste ... ;)
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

newfag

Cita de: Didacso en 18 Mayo 2010, 17:49 PM
Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica

char *aux = (char *) malloc(sizeof(char)*20);

al final solo tendrías que liberar toda la memoria que pediste ... ;)

jop eso de poner la aux con memoria dinámica ya es ajustar mucho eh? jaja pero si que tienes razón, muchisimas gracias por la ayuda, de verdad, estaba un poco perdido :)

Eternal Idol

Mas importante seria que no tuviera posibles agujeros de seguridad, como escribir mas caracteres que los reservados ... lo podes solucionar con fgets (con stdin) + sscanf.

PD. Lo ideal es evitar siempre el uso de scanf (para no ensuciar el buffer).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

newfag

y también tendría que comprobar si la reserva de memoria se hace bien y no devuelve NULL, pero era solo para practicar ese tema un poco, no quiero hacer un programa serio serio.
de todas maneras yo suelo usar scanf, pero uso siempre antes el __fpurge(stdin), para no coger cosas raras.

nicolasblues86

#9
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char :

para empezar te quisiera corregir un pequeño error, cuando pones

   

vect = (char*) calloc(sizeof(char),n);



no esta del todo bien, deberías poner:

   

vect = (char*) calloc(n, sizeof(char) );



es decir  ponías los parámetros al revés

puntero = (tipo*) calloc (numero de elementos, tamaño de cada elemento)

con esto reservarías la cantidad de mem justa que necesitas con respecto a hacer  mas dinámico el programa y no tener que ingresar el numero de la cantidad de palabras, podrías usar fgets :



int ext;
char* vect;
char cadena[50];

fgets (cadena, 50, stdin );

ext = strlen(cadena) + 1// se le suma uno porque se cuenta el fin de cadena

vect = (char*) calloc(ext, sizeof(char) );




Bueno creo que eso es todo

Saludos
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no