Autor
|
Tema: reservar memoria para punteros en C (Leído 18,939 veces)
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Vos queres acceder a: Y estas accediendo a: Podes hacerlo como muestro arriba de todo o asi:
|
|
|
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
|
estoy haciendo una prueba y calculo que esta vez hice bien el tema de la lista pero hay algo que me esta fallando en el programa y no me doy cuenta que es, porque al finalizar me salta un mensaje del visual studio preguntando si quiero debuggearlo. A ver que me decin ustedes. char** obtenerLista(int *contador) { int cont = 0; char buf[50], **lista; for(int i = 0; i < 10; i++) { printf("Ingresa cadena: "); fgets(buf, 50, stdin); buf[strlen(buf)-1] = '\0'; if(strlen(buf) > 0){ lista = (char**)realloc(lista, sizeof(char*)); lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1); strcpy(lista[cont], buf); ++cont; } } *contador = cont; return lista; }
int main(){ char **lista; int contador; lista = obtenerLista(&contador); for(int i =0; i < contador; i++){ printf("grupo %d: %s\n", i, lista[i]); } for(int i=0; i<contador; i++){ free(lista[i]); } free(lista); system("pause"); return 0; }
|
|
« Última modificación: 30 Mayo 2010, 16:59 pm por Ghalad »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
lista = (char**)realloc(lista, sizeof(char*));
lista es un puntero indefinido la primera vez que se llama a realloc (si lo inicializas a 0 es otra cosa) y ademas siempre reservas la misma cantidad de memoria (un puntero).
|
|
|
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
|
claro porque la idea es que, si hay una nue3va cadena a agregar se reserve memoria para un nuevo puntero a string y despues se reserve memoria para ese string. Segun entendi si el puntero no tienen memoria asiganada el realloc funciona como un malloc. Y que decis que lo tengo que inicializar con NULL a lista?
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/"ptr Pointer to a memory block previously allocated with malloc, calloc or realloc to be reallocated. If this is NULL, a new block is allocated and a pointer to it is returned by the function." Ademas tendras que calcular correctamente el tamaño para ir agregando cada vez un elemento mas ...
|
|
|
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
|
es que no hay que hacer calculos, es sencillo a vos te van a venir en varios strings, nose cuantos y lo que quiero hacer es: si me viene un string, reservo memoria para el puntero al string y reservo memoria para el string en si. Entonces no entiendo cual es el problema. lista = (char**)realloc(lista, sizeof(char*));
se supone que con eso cada vez que lo invoque genero una posicion mas de la lista de punteros que tengo que hacer para que funcioneeeeeeeeee????? jajajja
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Entonces el problema es que no entendes como funciona realloc, ya te deje el link antes:
"The size of the memory block pointed to by the ptr parameter is changed to the size bytes, expanding or reducing the amount of memory available in the block. ... size New size for the memory block, in bytes. If it is 0 and ptr points to an existing block of memory, the memory block pointed by ptr is deallocated and a NULL pointer is returned."
Si llamas a realloc con el mismo tamaño al final de cuentas no estas haciendo nada logico, siempre reservas memoria para UN puntero en este caso, el segundo parametro de realloc es el tamaño TOTAL y no el tamaño a "agregar" por decirlo de algun modo.
|
|
|
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
|
ahhh yo crei que vos le pasabas cuanto querias agrandar el bloque de memoria, entonces lo correcto seria algo asi: char** obtenerLista(int *contador) { int cont = 0; char buf[50], **lista = NULL; for(int i = 0; i < 10; i++) { printf("Ingresa cadena: "); fgets(buf, 50, stdin); buf[strlen(buf)-1] = '\0'; if(strlen(buf) > 0){ ++cont; lista = (char**)realloc(lista, sizeof(char*)*cont); if(lista == NULL) abort(); lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1); if(lista[cont]==NULL) abort(); strcpy(lista[cont], buf); } } *contador = cont; return lista; }
De esta forma estaria diciendo que el puntero se agrande sizeof(char*) cada vez que quiero agregar un nuevo string? char** obtenerLista(int *contador) { int cont = 0; char buf[50], **lista = NULL; for(int i = 0; i < 10; i++) { printf("Ingresa cadena: "); fgets(buf, 50, stdin); buf[strlen(buf)-1] = '\0'; if(strlen(buf) > 0){ ++cont; lista = (char**)realloc(lista, sizeof(char*)*cont); if(lista == NULL) abort(); lista[cont-1]= (char*)malloc( (sizeof(char)*strlen(buf))+1); if(lista[cont-1]==NULL) abort(); strcpy(lista[cont-1], buf); } } *contador = cont; return lista; }
con este codigo me funciones de 10! pero es correcto o e n que la estoy pifiando?
|
|
« Última modificación: 30 Mayo 2010, 19:52 pm por Ghalad »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Si, pero cont arranca de 0 asi que: lista = (char**)realloc(lista, sizeof(char*) * (cont+ 1));
|
|
|
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
|
ahi le reste 1, funciona bien pero esta bien hecho el codigo? no estoy desperdiciando memoria en algun lado?
|
|
|
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,420
|
17 Febrero 2012, 15:39 pm
por naderST
|
|
|
obtener factorial y evitar desbordamiento de memoria con punteros
Programación C/C++
|
kikian94
|
8
|
7,409
|
17 Noviembre 2013, 09:01 am
por kikian94
|
|
|
Estructuras y reservar memoria
Programación C/C++
|
kraiked
|
4
|
3,789
|
25 Febrero 2016, 23:01 pm
por lfgmespino
|
|
|
Ayuda al reservar memoria con calloc
Programación C/C++
|
agrichi
|
1
|
2,027
|
13 Diciembre 2017, 18:24 pm
por CalgaryCorpus
|
|
|
Puteros dobles y cadena de caracterez reservar memoria dinamica
Programación C/C++
|
Iclax
|
1
|
6,641
|
19 Agosto 2022, 16:55 pm
por RayR
|
|