Язык C: структуры и массивы символов - PullRequest
0 голосов
/ 25 августа 2010

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

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

Ответы [ 2 ]

0 голосов
/ 25 августа 2010

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

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

Надеюсь, это поможет ... хотя бы немного :) 1007 *

0 голосов
/ 25 августа 2010

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

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

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

Возможно, вы захотите где-нибудь объявить 25 константой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...