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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  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 1 Visitante 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,097 veces)
Ghalad

Desconectado Desconectado

Mensajes: 38


Ver Perfil
reservar memoria para punteros en C
« en: 24 Mayo 2010, 18:28 pm »

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 Desconectado

Mensajes: 5.937


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


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

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.

Código
  1. //reservar
  2. char **lista = (char**)malloc(sizeof(char*) * 3);
  3. for (int x = 0; x < 3; x++)
  4. {
  5.  lista[x] = (char*)malloc(sizeof(char) * 5);
  6. }
  7. //usar
  8. //liberar
  9. for (int x = 0; x < 3; x++)
  10. {
  11.  free(lista[x]);
  12. }
  13. 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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #2 en: 24 Mayo 2010, 21:03 pm »

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 Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #3 en: 24 Mayo 2010, 21:19 pm »

Puedes utilizar GesHi por favor?
En línea

Ghalad

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #4 en: 24 Mayo 2010, 21:25 pm »

Código
  1. void fnc(char** lista){
  2.    lista = (char**)malloc( sizeof(char*)*5 );
  3.    for(int i = 0; i < 5; i++){
  4.        *lista = (char*)malloc( sizeof(char)*10);
  5.        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.
  6.        }
  7. }
  8.  
  9.  
  10. int main(){
  11.  
  12. char** lista, **ptr;
  13.  
  14. fnc(lista);
  15.  
  16. ptr = lista; //para no perder el puntero
  17.  
  18. while(*ptr != NULL)
  19. {
  20.    while(**ptr != '\0')
  21.        printf("%s\n", *ptr++);
  22.    ptr++;
  23. }
  24. }//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 Desconectado

Mensajes: 5.937


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #5 en: 24 Mayo 2010, 21:39 pm »

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).

Código
  1. while(*ptr != '\0')
  2.        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 Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #6 en: 24 Mayo 2010, 21:52 pm »

Si a la funcion le paso una referencia a lista, el prototipo no seria
void fnc(char*** lista); ????

entonces...
quedamos de acuerdo en que
Código
  1. char** lista;
  2. lista = (char**)malloc( sizeof(char*)*5); // reservo espacio para 5 strings
  3. lista = (char*)malloc( sizeof(char)*10); // reservo 10 bytes para 1 de los 5 strings
  4.  

ahora, para copiar 1 cadena, es corecto?:
Código
  1. 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 Desconectado

Mensajes: 5.937


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


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #7 en: 25 Mayo 2010, 00:49 am »

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
Código
  1. char** lista;
  2. lista = (char**)malloc( sizeof(char*)*5); // reservo espacio para 5 strings
  3. lista = (char*)malloc( sizeof(char)*10); // reservo 10 bytes para 1 de los 5 strings
  4.  

Si.

ahora, para copiar 1 cadena, es corecto?:
Código
  1. 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
nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: reservar memoria para punteros en C
« Respuesta #8 en: 25 Mayo 2010, 01:25 am »

Yo te recomendaria mas el uso de la funcion strncpy() que strcpy()

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
http://c.conclase.net/librerias/index.php?ansifun=strncpy

Salu10.
En línea

Ghalad

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: reservar memoria para punteros en C
« Respuesta #9 en: 29 Mayo 2010, 18:42 pm »

mm algo me funcionamal aver:

Código
  1. void obtenerLista(char ***lista)
  2. {
  3.     char buf[50];
  4.     *lista = (char**)malloc(sizeof(char*)*5);
  5.     for(int i=0; i<5; i++)
  6.     {
  7.             printf("Ingresa cadena: ");
  8.             fgets(buf, 50, stdin);
  9.             *lista[i]= (char*)malloc(sizeof(char)*strlen(buf));
  10.             strcpy(*lista[i], buf);
  11.     }
  12. }

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

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

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