Estructuras dinámicas

EtherMaN

Hola estoy haciendo un trabajo y por eso he escrito recientemente otro post. El caso es que deseo hacer una estructura con campos dinámicos. Por ejemplo :

typedef struct datos{

char *caracter;

} registros;

registros bdd;

¿ puedo hacer que *caracter forme parte de memoria dinámica a la hora de reservar ? He visto por google otras alternativas pero son realmente complejas a lo que yo busco. ¿ Hay alguna forma sencilla de hacerlo ?

Er_Goliath

Este es mi 1 año de programacion y se poco de esto pero,asi no estas convirtiendo la variable caracter en un puntero?explika un poko lo q kieres acer aber si te puedo ayudar

EtherMaN

pues lo que me gustaria es convertir la variable caracter usando la memoria dinámica para reservar solo lo necesario de memoria.

Usando malloc, calloc.. etc

shortyStyle

Hay formas, una sencilla es crear una structura con datos y otra estructura que sea un nodo, algo así:

struct datos{

char nombre[15];
int edad;

};

struct nodo {

struct datos info;
struct nodo *siguiente;

};

Luego en el programa vas creando punteros del tipo struct nodo, luego les buscas espacio en memoria con el malloc, algo así:

struct nodo *p;

if((p=(struct nodo *)malloc(sizeof(struct nodo)))!=NULL)
{

printf("Nombre: \n");
gets(p->datos.nombre);
printf("Edad: \n");
scanf("%d",&p->datos.edad);

}

Ahora mismo tienes un nodo con los datos de una persona y aún en nodo tienes un puntero (*siguiente) que lo puedes usar conectandolo otra persona para que que no se vaya perdiendo la información.

Toma un ejercicio que hice yo hace un tiempo que acabo de encontrar sobre eso, espero que te sirva:

http://pastebin.es/997

javithelong

No te líes, lo que tienes está bien.

Si quieres el número exacto de registros, pones un puntero a registros, y le reservas la memoria que necesites.

Lo mismo para cada cadena de caracteres dinámica que tengas en los registros, pones un puntero a char (como ya tienes) y le reservas la memoria que quieras (y luego le copias la cadena que quieras).

Únicamente te recuerdo el carácter '\0' de fín de cadena, para el que deberías reservar memoria también en la cadena de caracteres del registro oportuno.

Resumiendo:

registros * bdd;

Para reservar 3 registros:

bdd = (registros ) malloc (sizeof(registros)3);

Para escribir una cadena en el segundo registro desde la cadena 'fuente':

bdd[1]->cadena = (char)malloc(sizeof(char)(strlen(fuente)+1));
strcpy(bdd[1]->cadena, fuente);

Si necesitas algo más...

PD: lo de #4 es una lista enlazada, y si no sabes exáctamente lo que es, mejor no te pongas a programarla. Es útil, pero más compleja de manejar y requiere un poco de soltura con punteros.

gF

#1 la respuesta es sí, tal como lo tienes es correcto pero tendrás que reservar la memoria para la cadena de caracteres.

uplink

exacto, pero si la reservas a una cadena de caracteres, esta cadena de caracteres será estática (array de caracteres)

Para hacer lo que quieres es mejor implementar una cadena de caracteres como lista dinámica e implementar la funcion de leercadena y escribir cadena.

Luego tu caracter será un puntero hacía esta cadena dinámica.

Espero haber servido de ayuda. Si necesitas algo más manda un mensaje privado.

Saludos.

Gn0m4

¿Pero porqué le liais tanto la cabeza? Que si listas, que si no se que..
Si ya tiene bien claro lo que quiere, tiene una estructura, lo único que pregunta es si puede utilizar variables dinámicas dentro de la estructura.

Y la respuesta es sí, solo las tienes que definir como punteros (exactamente como lo tienes definido en el ejemplo). En ese caso en concreto, posteriormente solo tendrías que reservar espacio para la longitud de cadena que quieras meter, y copiar la cadena.
No se te olvide muy importante crear destructores siempre que tengas variables dinámicas.

cabron

#8:

Es algo típico de este foro, alguien pregunta como declarar una variable de tipo entero, y la gente acaba hablando de como acceder a los registros del procesador usando ensamblador : P

T

jajajaja la peña salta con listas enlazadas... si claramente se esta refiriendo a un ARBOL B

gF

si, lo de #7 es de traca, jaja listas enlazadas para una cadena de caracteres? en fin lo que hay que leer...

en #6 respondí a lo que se preguntaba bastante claro

Usuarios habituales

  • gF
  • cabron
  • Gn0m4
  • javithelong
  • shortyStyle
  • EtherMaN
  • Er_Goliath