2010-08-25 2 views
0

Когда я пытаюсь сделать printf() значение данных, я ничего не получаю, но если бы я должен был делать date = "text" Это сработало. Кто-нибудь знает причину этого?C язык: структуры и массивы символов

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

Текущая версия вашего примера (# 4) отлично работает для меня. Вы пробовали это после того, как вы добавили 'char *' в параметр 'значение' 'cake()' function 'функции? – MatthewD

+0

Да, я ошибся при попытке восстановить проблему. – Jay

+0

эта кодовая версия не работает; отсутствующие прототипы для торта и пончика – user411313

ответ

0

Возможно, этот пример может помочь:

#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; 
} 

Вот пример вывода:

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

«Надежда, что помогает ... по крайней мере, немного :)

+0

Я не уверен, что я старше. Спасибо, я должен буду с этим разобраться, так как он отлично работает. – Jay

+0

Hi - Я не был уверен, в чем состоял ваш вопрос, поэтому я собрал пример, иллюстрирующий пару вещей, которые, как я думал, вы были неясны. Я надеюсь, что хотя бы какой-то пример может быть вам полезен. В любом случае, пожалуйста, отправьте сообщение, когда найдете решение, и, пожалуйста, отметьте проблему «решена», – paulsm4

0

Он отлично подходит для меня, если вы добавите char * в стоимость. Без этого я думаю, что это неявный int. Это исключено из C99. Даже если это не так, вы должны явно не передавать char * как целое число. Кроме того, я не знаю, разрешено ли вам смешивать неявные int и явные типы (struct aac *).

Другая проблема заключается в том, что ваш второй malloc не переносится. На 32-битной машине будет выделено 25 указателей, но на 64-битном 12.5, что не имеет смысла. Используйте что-то вроде:

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

Возможно, вы захотите объявить 25 как постоянную.

+0

Он печатает для вас значение? – Jay

Смежные вопросы