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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  reservar memoria para punteros en C
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: reservar memoria para punteros en C  (Leído 18,939 veces)
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #10 en: 29 Mayo 2010, 20:14 pm »

Vos queres acceder a:
Código:
lista[0][i]

Y estas accediendo a:
Código:
lista[i][0]

Podes hacerlo como muestro arriba de todo o asi:
Código:
(*lista)[i]


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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #11 en: 30 Mayo 2010, 16:43 pm »

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.
Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   lista = (char**)realloc(lista, sizeof(char*));
  14.                   lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  15.                   strcpy(lista[cont], buf);
  16.                    ++cont;
  17.               }
  18.       }
  19.       *contador = cont;
  20.       return lista;
  21. }

Código
  1. int main(){
  2. char **lista;
  3.    int contador;
  4.  
  5.    lista = obtenerLista(&contador);
  6.  
  7.    for(int i =0; i < contador; i++){
  8.        printf("grupo %d: %s\n", i, lista[i]);
  9.        }
  10.  
  11.  
  12.  
  13.    for(int i=0; i<contador; i++){
  14.            free(lista[i]);
  15.            }
  16.    free(lista);
  17.  
  18.    system("pause");
  19.    return 0;
  20. }


« Última modificación: 30 Mayo 2010, 16:59 pm por Ghalad » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #12 en: 30 Mayo 2010, 17:20 pm »

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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #13 en: 30 Mayo 2010, 17:37 pm »

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 Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #14 en: 30 Mayo 2010, 17:41 pm »

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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #15 en: 30 Mayo 2010, 18:19 pm »

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.

Código
  1.  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 Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #16 en: 30 Mayo 2010, 19:25 pm »

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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #17 en: 30 Mayo 2010, 19:47 pm »

ahhh yo crei que vos le pasabas cuanto querias agrandar el bloque de memoria, entonces lo correcto seria algo asi:
Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista = NULL;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   ++cont;
  14.                   lista = (char**)realloc(lista, sizeof(char*)*cont);
  15.                   if(lista == NULL) abort();
  16.                   lista[cont]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  17.                   if(lista[cont]==NULL) abort();
  18.                   strcpy(lista[cont], buf);
  19.               }
  20.       }
  21.       *contador = cont;
  22.       return lista;
  23. }

De esta forma estaria diciendo que el puntero se agrande sizeof(char*) cada vez que quiero agregar un nuevo string?

Código
  1. char** obtenerLista(int *contador)
  2. {
  3.       int cont = 0;
  4.       char buf[50], **lista = NULL;
  5.  
  6.       for(int i = 0; i < 10; i++)
  7.       {
  8.               printf("Ingresa cadena: ");
  9.               fgets(buf, 50, stdin);
  10.               buf[strlen(buf)-1] = '\0';
  11.  
  12.               if(strlen(buf) > 0){
  13.                   ++cont;
  14.                   lista = (char**)realloc(lista, sizeof(char*)*cont);
  15.                   if(lista == NULL) abort();
  16.                   lista[cont-1]= (char*)malloc( (sizeof(char)*strlen(buf))+1);
  17.                   if(lista[cont-1]==NULL) abort();
  18.                   strcpy(lista[cont-1], buf);
  19.               }
  20.       }
  21.       *contador = cont;
  22.       return lista;
  23. }
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 Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #18 en: 30 Mayo 2010, 19:51 pm »

Si, pero cont arranca de 0 asi que:
Código:
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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #19 en: 30 Mayo 2010, 19:54 pm »

ahi le reste 1, funciona bien pero esta bien hecho el codigo? no estoy desperdiciando memoria en algun lado?
En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines