elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con Malloc y cadenas de tamaño variable.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con Malloc y cadenas de tamaño variable.  (Leído 10,690 veces)
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Problema con Malloc y cadenas de tamaño variable.
« en: 22 Noviembre 2010, 12:58 pm »

Hola. Saludos a todos.

Tengo un problema a la hora de entender malloc, el caso es que quiero un array que cada elemento almacene cadenas de dimension variable.
En principio tengo:

Código:
char nombre[2];
nombre[0] = (char *)malloc(sizeof(char));

Supuestamente esto me funciona, es decir, yo puedo usar scanf y almacenar una cadena del tamaño que yo quiera en nombre[0], pero el caso es que creo que la asignación de memoria esta mal, es decir, yo estoy reservando memoria para lo que ocupa un carácter, es decir un byte, por lo tanto no me tendría que dejar almacenar mas de un bye, al menos que este machando la memoria a partir de la posición de asignación de dicho byte, por eso quería saber si este código es correcto.
Es decir, si de esta forma yo estoy reservando memoria para una cadena de tamaño variable en nombre[0].

Un Saludo.


En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #1 en: 22 Noviembre 2010, 13:18 pm »

Tal como asumes, esa asignación está mal. Estás asignando en un char un puntero a char. De hecho el compilador debería darte un error como mínimo.

Para lo que tu quieres hacer, primero necesitas un puntero a puntero a char, o también visto como un vector de cadenas.

Código
  1. char **nombre;
  2. nombre= nombre=(char**)malloc(n*sizeof(char*)); //n=numero de cadenas
  3. //luego, para cada cadena:
  4. nombre[i]=(char*)malloc(n*sizeof(char)); // n= numero de caracteres en la cadena
  5.  


o

Código
  1. char nombre[tam1][tam2]
En esta opción el tamaño de la matriz de carácteres / vector de cadenas se define en tiempo de compilación.

En ambos casos, el uso sería el mismo, como si de una matriz se tratase

PD: Es posible que en el código usando malloc pueda haber alguna incorrección, hace tiempo que no lo uso.

Edit: gracias por la corrección, Eternal Idol.


« Última modificación: 22 Noviembre 2010, 13:57 pm por Akai » En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #2 en: 22 Noviembre 2010, 13:31 pm »

Muchísimas gracias por la respuesta Akai pero tengo un problema, mi idea es que yo "n" no lo conozco hasta que no inserto la cadena, necesito que se asigne el tamaño en tiempo de ejecución del programa, así que si el usuario inserta 5 caracteres la cadena tenga un tamaño de 5 bytes en la memoria.

¿Como puedo hacer eso?
Un saludo y gracias de nuevo.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #3 en: 22 Noviembre 2010, 13:36 pm »

Podes usar una variable temporal donde leer la cadena:

Código
  1. char tmp[80];
  2. fgets(tmp, sizeof(tmp), stdin);

Despues solo tenes que usar strlen para saber el tamaño (no te olvides de reservar memoria para el 0 terminador de cadena) y copiar.


PD. Al reservar los punteros a cadena se tiene que usar el sizeof de char* y no de char para obtener el tamaño.
« Última modificación: 22 Noviembre 2010, 13:38 pm por Eternal Idol » En línea

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
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #4 en: 22 Noviembre 2010, 13:39 pm »

Gracias Eternal Idol pero mi problema sigue estando ahí, yo no quiero que la variable temporal sea de 80 caracteres como máximo, ya que no se cuanto se puede introducir, podrían ser mas o menos, me gustaría poder pasarle el valor de caracteres a la cadena en tiempo de ejecución.
Saludos.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #5 en: 22 Noviembre 2010, 13:46 pm »

No, no hay ningun problema, en todo caso se truncaria pero 80 es un tamaño mas que suficiente para practicamente cualquier cosa, si te parece insuficiente siempre podes reemplazar el 80 por 32768 por ejemplo.
En línea

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
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #6 en: 22 Noviembre 2010, 14:08 pm »

Pero si lo reemplazo por eso, ¿no estaría desperdiciando memoria en el momento de capturar la cadena en tmp?

Sigo teniendo la curiosidad de hacer ese 80, ponerle en vez de un numero una variable y sacar cuando caracteres he introducido por teclado, eso lo puedo hacer, usando los flujos o algo así?
Un saludo y muchísimas gracias.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #7 en: 22 Noviembre 2010, 14:21 pm »

Si pones el codigo en una funcion al salir de la misma todo esa memoria vuelve a estar disponible. ¿Estas tratando de entender malloc o tenes requisitos de un hardware con infima memoria?

No hay forma de saber el tamaño de la cadena ANTES de que el usuario la escriba, salvo que tambien tenga que escribir el tamaño de la misma ...
« Última modificación: 22 Noviembre 2010, 14:24 pm por Eternal Idol » En línea

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
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #8 en: 22 Noviembre 2010, 14:29 pm »

Muchas gracias Eternal Idol, en realidad no quiero decir antes, si no una vez que la ha ingresado, yo es que ahora mismo no estoy muy puesto en memoria dinamica, pero podría hacerse algo asi:

Sería coger y poner un tamaño mínimo de un byte, si la cadena no entra en ese tamaño entonces con realloc se asigna un nuevo de tamaño de los mismos byte que la cadena.

Un saludo.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema con Malloc y cadenas de tamaño variable.
« Respuesta #9 en: 22 Noviembre 2010, 14:36 pm »

¿Que la ha ingresado en donde? Para poder ingresarla se necesita minimo el tamaño exacto de la cadena ya reservado (incluyendo el 0 terminador). ¿Como sabes si la cadena no entra? Si es tratando de ingresar los datos en esa cadena para la que reservas un caracter (el 0 terminador en realidad) usando fgets correctamente no tendras nunca nada en la cadena, usando algun metodo inseguro accederas a memoria no reservada ...
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema al concatenar cadenas
PHP
Feedeex 4 4,858 Último mensaje 13 Mayo 2011, 12:49 pm
por Feedeex
Duda, problema de asignacion con Malloc
Programación C/C++
Fabi0lo 6 3,226 Último mensaje 25 Noviembre 2012, 18:31 pm
por 0xDani
Ayuda leer cadenas y guardarlas en una sola variable
Programación C/C++
rulax01 3 2,390 Último mensaje 21 Noviembre 2014, 00:49 am
por zShackra
Migrar funcion de C a C# problema con tamaño de variable 16 y 32 bits
Programación General
AlbertoBSD 2 2,430 Último mensaje 21 Marzo 2018, 22:59 pm
por AlbertoBSD
Variable de tamaño dinámico?
Programación C/C++
huchoko 4 2,479 Último mensaje 6 Julio 2019, 08:19 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines