我有以下代码:
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;
}
由于某种原因,每当我尝试运行该程序时,该程序便始终是垃圾值。
输出始终为:
卡片为:
我尝试使用gdb调试它。在我到达printf语句之前,char值是正确的,然后它们突然更改。我不知道为什么会这样。
以下是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'}
答案 0 :(得分:1)
问题在下面的行中:-
p->card_list = &h;
h
是局部变量。一旦功能范围结束,将释放内存。这导致未定义的行为。