C: почему значения символов меняются после оператора printf? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий код:

struct card{
   char rank;
   char suit;
};

struct hand{
   struct card top;
   struct hand* next;
};

struct player{
   struct hand* card_list;
};


int add_card(struct player* p, struct card* new_card)
{
   struct card c = {new_card->suit, new_card->rank};
   struct hand h = {c, NULL};
   p->card_list = &h;
}

int main()
{
   struct player p;
   struct card c = {'T', 'S'};
   add_card(&p, &c);
   printf("Card is: %c%c\n\n", p.card_list->top.rank, p.card_list->top.suit);
   return 0;
}

По какой-то причине программа всегда выдает значение мусора всякий раз, когда я пытаюсь его запустить.

Выходные данные всегда:

Карта: 100

Я попытался отладить ее с помощью GDB.Значения char верны, пока я не достигну оператора printf, после чего они внезапно изменятся.Я не знаю, почему это так.

Ниже вывод GDB:

(gdb) print p.card_list->top
$6 = {suit = 83 'S', rank = 84 'T'}
(gdb) s
78          printf("Card is: %c%c\n\n", p.card_list->top.rank, p.card_list->top.suit);
(gdb) s

Card is: ▒▒
(gdb) print p.card_list->top
$7 = {suit = -32 '\340', rank = -53 '\313'}

1 Ответ

0 голосов
/ 15 октября 2018

Проблема в строке ниже: -

  p->card_list = &h;

h - локальная переменная.Память освободится, как только закончится область действия функции.Что вызывает неопределенное поведение.

...