problema con doble punteros

Iniciado por m@o_614, 26 Enero 2014, 23:11 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 4

typedef struct
{
    char **nombre;
}CODOP;

int main()
{
    int tam,tam1,tam2,tam3,i;
    CODOP *x;
    char **p;
    x = (CODOP*)malloc(sizeof(CODOP));
    p = (char**)malloc(MAX*sizeof(char*));
    p[0] = "anita";
    p[1] = "lava";
    p[2] = "la";
    p[3] = "tina";
    tam = strlen(p[0]);
    tam1 = strlen(p[1]);
    tam2 = strlen(p[2]);
    tam3 = strlen(p[3]);
    x->nombre = (char**)malloc(MAX*sizeof(char*));
    x->nombre[0] = (char*)malloc((tam+1)*sizeof(char));
    x->nombre[1] = (char*)malloc((tam1+1)*sizeof(char));
    x->nombre[2] = (char*)malloc((tam2+1)*sizeof(char));
    x->nombre[3] = (char*)malloc((tam3+1)*sizeof(char));
    strcpy(x->nombre[0],p[0]);
    strcpy(x->nombre[1],p[1]);
    strcpy(x->nombre[2],p[2]);
    strcpy(x->nombre[3],p[3]);
    for(i = 0;i < MAX;i++)
       printf("%s\n",x->nombre[i]);
    return 0;
}


gracias de antemano

leosansan


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

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



nolasco281

#2
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.


Lo que se puede imaginar... se puede programar.

leosansan


eferion


CODOP *x; // => char ***; // en verdad es necesario esto ??
char **p;
x = (CODOP*)malloc(sizeof(CODOP));

// un puntero doble es como una matriz, necesita dos inicializaciones
// primero una para las filas y luego hay que inicializar cada columna por separado
// aqui solo estas inicializando las filas
p = (char**)malloc(MAX*sizeof(char*));

// esto podria funcionar en c++... en c hay que usar strcpy
// en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
p[0] = "anita";
p[1] = "lava";
p[2] = "la";
p[3] = "tina";


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

rir3760

Cita de: eferion en 30 Enero 2014, 10:48 AM
// esto podria funcionar en c++... en c hay que usar strcpy
// en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
p[0] = "anita";
p[1] = "lava";
p[2] = "la";
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language