Autor
|
Tema: reservar memoria para punteros en C (Leído 19,056 veces)
|
Ghalad
Desconectado
Mensajes: 38
|
Hola a todos, tengo una duda sobre este tema. Entiendo que si declaro:
char *cadena; cadena = (char*)malloc( (sizeof(char)*4) + 1);
estoy declarando un puntero a un string de 5 posiciones, pj: "HOLA"+'\0'. Entonces tengo 2 preguntas:
1ro) que diferencia hay entre: (char*)malloc(sizeof(char)*5); (char*)malloc(sizeof(char*)*5);
2do) si lo que quiero es tener una lista de strings dinamica y declaro:
char **lista;
como declaro correctamente memoria para los distintos strings que quiera agregar a la lista? supongamos que los strings, en un determinado momento, son "hola1", "hola2", "hola3"
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Si, entendiste bien hasta ahi. 1)(char*)malloc(sizeof(char)*5); Reserva memoria para 5 caracteres. (char*)malloc(sizeof(char*)*5); Reserva memoria para 5 PUNTEROS a caracteres (pero deberias hacer el casting a char **). En realidad siempre reserva memoria simplemente, pero desde un punto de vista logico la diferencia seria esa con el casting correcto, en una PC con un S.O. de 32 bits, char = 1 byte, char *(y cualquier otro puntero) 4 bytes. 2) Reservas primero la memoria para los punteros a cadena y despues la memoria para las cadenas mismas. //reservar char **lista = (char**)malloc(sizeof(char*) * 3); for (int x = 0; x < 3; x++) { lista[x] = (char*)malloc(sizeof(char) * 5); } //usar //liberar for (int x = 0; x < 3; x++) { free(lista[x]); } free(lista);
|
|
« Última modificación: 24 Mayo 2010, 19:29 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
|
|
|
Ghalad
Desconectado
Mensajes: 38
|
ahhhh, bueno entonces dado mi programa...para generar la lista de strings seria correcto hacer:
void fnc(char** lista){ lista = (char**)malloc( sizeof(char*)*5 ); for(int i = 0; i < 5; i++){ *lista = (char*)malloc( sizeof(char)*10); strcpy(*list, cadena); //cadena es un string que se genera dentro de la misma funcion, solo que no tengo ganas de poner la funcion completa porque interviene un base de datos, pero es un string. } }
int main(){
char** lista, **ptr;
fnc(lista);
ptr = lista; //para no perder el puntero
while(*ptr != NULL) { while(**ptr != '\0') printf("%s\n", *ptr++); ptr++; } }//fin del main
|
|
|
En línea
|
|
|
|
h0oke
Desconectado
Mensajes: 2.059
Coder ~
|
Puedes utilizar GesHi por favor?
|
|
|
En línea
|
|
|
|
Ghalad
Desconectado
Mensajes: 38
|
void fnc(char** lista){ lista = (char**)malloc( sizeof(char*)*5 ); for(int i = 0; i < 5; i++){ *lista = (char*)malloc( sizeof(char)*10); strcpy(*list, cadena); //cadena es un string que se genera dentro de la misma funcion, solo que no tengo ganas de poner la funcion completa porque interviene un base de datos, pero es un string. } } int main(){ char** lista, **ptr; fnc(lista); ptr = lista; //para no perder el puntero while(*ptr != NULL) { while(**ptr != '\0') printf("%s\n", *ptr++); ptr++; } }//fin del main
asi? no tengo idea de como se usa igual creo que camulle en los while para recorrer la lista
|
|
« Última modificación: 24 Mayo 2010, 21:28 pm por Ghalad »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Esta mal la inicializacion ... siempre accedes a lista[0], mira el ejemplo que deje. El bucle esta mal del todo, primero y principal para poder usarlo tendrias que reservar un puntero mas y asignarle como valor 0; ademas de pasar la variable lista por referencia (la asignacion que haces ahora mismo en fnc es local, al volvera main lista sigue teniendo el mismo valor que antes de llamar a fnc). while(*ptr != '\0') printf("%s\n", *ptr++);
|
|
|
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
|
|
|
Ghalad
Desconectado
Mensajes: 38
|
Si a la funcion le paso una referencia a lista, el prototipo no seria void fnc(char*** lista); ???? entonces... quedamos de acuerdo en que char** lista; lista = (char**)malloc( sizeof(char*)*5); // reservo espacio para 5 strings lista = (char*)malloc( sizeof(char)*10); // reservo 10 bytes para 1 de los 5 strings
ahora, para copiar 1 cadena, es corecto?: strcpy(lista[i], "mi cadena");
pensa que todo el tema de asignacion de memoria y strings se hace dentro de la funcion, no en el main.
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Si a la funcion le paso una referencia a lista, el prototipo no seria void fnc(char*** lista); ???? Si, ahora mismo si inicializas lista a 0 y depuras vas a ver que lista sigue siendo 0. entonces... quedamos de acuerdo en que char** lista; lista = (char**)malloc( sizeof(char*)*5); // reservo espacio para 5 strings lista = (char*)malloc( sizeof(char)*10); // reservo 10 bytes para 1 de los 5 strings
Si. ahora, para copiar 1 cadena, es corecto?: strcpy(lista[i], "mi cadena");
Tambien. pensa que todo el tema de asignacion de memoria y strings se hace dentro de la funcion, no en el main. Si, ya lo hice funcionar tanto en C (char*** como en C++ **&).
|
|
|
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
|
|
|
|
Ghalad
Desconectado
Mensajes: 38
|
mm algo me funcionamal aver: void obtenerLista(char ***lista) { char buf[50]; *lista = (char**)malloc(sizeof(char*)*5); for(int i=0; i<5; i++) { printf("Ingresa cadena: "); fgets(buf, 50, stdin); *lista[i]= (char*)malloc(sizeof(char)*strlen(buf)); strcpy(*lista[i], buf); } }
int main(){ char **lista; obtenerLista(&lista); for(int i =0; i<5; i++){ printf("grupo %d: %s", i, lista[i]); } for(int i=0; i<5; i++){ free(lista[i]); } free(lista); retunr 0; }
lo que quiero es una lista de strings, y como nose cuantos estoy le voy a poner a la lista estaria bueno, en vez de usar malloc(sizeof(char*)*5), usar realloc. Pero bueno si funciona con malloc despues se cambia. que esta mal de ese codigo?
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Reservar memoria con new a una clase con varios elementos y constructor.
Programación C/C++
|
anonimo12121
|
7
|
4,452
|
17 Febrero 2012, 15:39 pm
por naderST
|
|
|
obtener factorial y evitar desbordamiento de memoria con punteros
Programación C/C++
|
kikian94
|
8
|
7,448
|
17 Noviembre 2013, 09:01 am
por kikian94
|
|
|
Estructuras y reservar memoria
Programación C/C++
|
kraiked
|
4
|
3,835
|
25 Febrero 2016, 23:01 pm
por lfgmespino
|
|
|
Ayuda al reservar memoria con calloc
Programación C/C++
|
agrichi
|
1
|
2,051
|
13 Diciembre 2017, 18:24 pm
por CalgaryCorpus
|
|
|
Puteros dobles y cadena de caracterez reservar memoria dinamica
Programación C/C++
|
Iclax
|
1
|
6,681
|
19 Agosto 2022, 16:55 pm
por RayR
|
|