2010-08-25 8 views
0

Lorsque j'essaie de printf() la valeur des données, je ne reçois rien, mais si je devais faire date = "text" Cela fonctionnerait. Quelqu'un connaît la raison de cela?langage C: structs et tableaux de caractères

struct aac { char **data; }; 

int main () { 
    char* value = malloc (100); 
    strcpy (value, "test"); 
    struct aac b; 
    b.data = malloc (100); 
    cake (value, &b); 
    donut (&b); 
    return 0; 
} 

int cake (char *value, struct aac *c) { 
    c->data[0] = value; 
    return 0; 
} 

int donut (struct aac *b) { 
    printf ("%s", b->data[0]); 
    return 0; 
} 
+0

La version actuelle de votre exemple (# 4) fonctionne bien pour moi. L'avez-vous essayé après avoir ajouté 'char *' au paramètre 'value' de la fonction' cake() '? – MatthewD

+0

Oui, j'ai fait une erreur en essayant de reconstruire le problème. – Jay

+0

cette version de code ne fonctionne pas; prototypes manquants pour le gâteau et donut – user411313

Répondre

0

Peut-être cet exemple pourrait aider:

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#include <errno.h> 

struct aac { 
    char **pastries; 
}; 

void 
init_pastries (struct aac * rec_p, int max) 
{ 
    /* Allocate space for max #/pastries, plus a NULL delimiter */ 
    int nbytes = sizeof (char *) * (max+1); 
    rec_p->pastries = (char **)malloc (nbytes); 
    memset (rec_p->pastries, 0, nbytes); 
    printf ("init_pastries: max #/pastries: %d, malloc: %d bytes...\n", 
    max, nbytes); 
} 

void 
add_pastry (char * name, int i, struct aac *rec_p) 
{ 
    int nbytes = strlen (name) + 1; 
    rec_p->pastries[i] = (char *)malloc (nbytes); 
    strcpy (rec_p->pastries[i], name); 
    printf ("add_pastry (%s): malloc= %d bytes...\n", 
    name, nbytes); 
} 

void 
print_pastries (struct aac * rec_p) 
{ 
    char **s = NULL; 
    for (s = rec_p->pastries; (*s); s++) 
    printf ("pastry: %s...\n", *s); 
} 

int 
main () { 
    struct aac rec; 
    init_pastries (&rec, 5); 
    add_pastry ("cake", 0, &rec); 
    add_pastry ("donut", 1, &rec); 
    print_pastries (&rec); 
    return 0; 
} 

est ici un exemple de sortie:

gcc -o tmp tmp.c 

./tmp 
    init_pastries: max #/pastries: 5, malloc: 24 bytes... add_pastry 
    (cake): malloc= 5 bytes... add_pastry 
    (donut): malloc= 6 bytes... pastry: 
    cake... pastry: donut... 

« espoir qui aide ... au moins un peu :)

+0

Je ne suis pas sûr de ce que je suis à la recherche. Merci, je vais devoir jeter un coup d'œil car cela fonctionne parfaitement. – Jay

+0

Salut - Je ne savais pas exactement quelle était votre question, alors j'ai rassemblé un exemple illustrant quelques-unes des choses que je pensais que vous ne saviez pas. J'espère qu'au moins une partie de l'exemple pourrait vous être utile. Dans tous les cas, veuillez poster une réponse lorsque vous trouvez une solution, et s'il vous plaît marquer le problème "résolu" – paulsm4

0

Il fonctionne bien pour moi si vous ajoutez char * à la valeur. Sans cela, je pense que c'est implicite int. Ceci est supprimé de C99. Même si ce n'était pas le cas, vous ne devriez pas passer un char * en entier. De plus, je ne sais pas si vous êtes même autorisé à mélanger des types int et explicite implicites (struct aac *).

Un autre problème est que votre deuxième malloc n'est pas portable. Sur une machine 32 bits, il va allouer 25 pointeurs, mais sur un 12.5 64 bits, ce qui n'a pas de sens. Utilisez quelque chose comme:

b.data = malloc (sizeof(char *) * 25); 

Vous pourriez vouloir déclarer 25 comme constante quelque part.

+0

Il imprime la valeur pour vous? – Jay

Questions connexes