Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 26 Enero 2014, 23:11 pm



Título: problema con doble punteros
Publicado por: m@o_614 en 26 Enero 2014, 23:11 pm
Saludos tengo una variable que es de tipo char** p, esto es para que sea un arreglo que contenga cadenas de tamaño variable y despues estas variables asignarselas al elemento nombre del mismo tipo que esta en una estructura, el problema es que el codigo me truena y no se por que

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 4
  5.  
  6. typedef struct
  7. {
  8.    char **nombre;
  9. }CODOP;
  10.  
  11. int main()
  12. {
  13.    int tam,tam1,tam2,tam3,i;
  14.    CODOP *x;
  15.    char **p;
  16.    x = (CODOP*)malloc(sizeof(CODOP));
  17.    p = (char**)malloc(MAX*sizeof(char*));
  18.    p[0] = "anita";
  19.    p[1] = "lava";
  20.    p[2] = "la";
  21.    p[3] = "tina";
  22.    tam = strlen(p[0]);
  23.    tam1 = strlen(p[1]);
  24.    tam2 = strlen(p[2]);
  25.    tam3 = strlen(p[3]);
  26.    x->nombre = (char**)malloc(MAX*sizeof(char*));
  27.    x->nombre[0] = (char*)malloc((tam+1)*sizeof(char));
  28.    x->nombre[1] = (char*)malloc((tam1+1)*sizeof(char));
  29.    x->nombre[2] = (char*)malloc((tam2+1)*sizeof(char));
  30.    x->nombre[3] = (char*)malloc((tam3+1)*sizeof(char));
  31.    strcpy(x->nombre[0],p[0]);
  32.    strcpy(x->nombre[1],p[1]);
  33.    strcpy(x->nombre[2],p[2]);
  34.    strcpy(x->nombre[3],p[3]);
  35.    for(i = 0;i < MAX;i++)
  36.       printf("%s\n",x->nombre[i]);
  37.    return 0;
  38. }
  39.  

gracias de antemano


Título: Re: problema con doble punteros
Publicado por: leosansan en 27 Enero 2014, 02:19 am

Pues a mi me corre sin problemas. ¿Qué problema tienes?.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: problema con doble punteros
Publicado por: nolasco281 en 27 Enero 2014, 04:45 am
Hola amigo como te comento leosansan el código corre pero parece que hay algún error en los char yo no entiendo mucho los punteros pero eh leído un poco sobre ellos, y la mayoría dice que es mejor trabajar con cadenas.  Ya que dan menos problemas que los char. pero eso es lo que he leído.

Recuerda que un char solo almacena un carácter a menos que lo hagas por arreglos y manejar char con arreglos es un poco más complicado te recomendaría que provees string si logro que no me de error te comparto la solución.
Saludos.


(http://4.bp.blogspot.com/-tFTwpNIAFFw/UuXTTyd130I/AAAAAAAAAas/RlCR8xKVbK4/s1600/Ayuda.png)


Título: Re: problema con doble punteros
Publicado por: leosansan en 27 Enero 2014, 09:42 am

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/CODOP_zps0d53148a.jpg)


Título: Re: problema con doble punteros
Publicado por: eferion en 30 Enero 2014, 10:48 am
Código
  1. CODOP *x; // => char ***; // en verdad es necesario esto ??
  2. char **p;
  3. x = (CODOP*)malloc(sizeof(CODOP));
  4.  
  5. // un puntero doble es como una matriz, necesita dos inicializaciones
  6. // primero una para las filas y luego hay que inicializar cada columna por separado
  7. // aqui solo estas inicializando las filas
  8. p = (char**)malloc(MAX*sizeof(char*));
  9.  
  10. // esto podria funcionar en c++... en c hay que usar strcpy
  11. // en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
  12. p[0] = "anita";
  13. p[1] = "lava";
  14. p[2] = "la";
  15. p[3] = "tina";

Por cierto, no veo un solo free que libere la memoria...


Título: Re: problema con doble punteros
Publicado por: rir3760 en 30 Enero 2014, 18:20 pm
Código
  1. // esto podria funcionar en c++... en c hay que usar strcpy
  2. // en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
  3. p[0] = "anita";
  4. p[1] = "lava";
  5. p[2] = "la";
  6. p[3] = "tina";

Por cierto, no veo un solo free que libere la memoria...
En C es valido porque antes de la asignación las literales "anita", "lava", etc. se sustituyen por las direcciones donde estas se almacenan y con ello se copia la dirección (pero no el contenido) del objeto.

Supongo solo es un programa para practicar el uso de punteros (honestamente no me gusta).

Un saludo