C--初始化动态列表时遇到问题

C--初始化动态列表时遇到问题,c,C,我写的21点程序中的deal函数有问题。有人知道发生了什么事吗?当我尝试在main()中打印时,出现了一个分段错误 干杯 主要功能 int main(void) { int i, j, k, purse; card deck[52]; card *head_d, *temp_d, *current_d = NULL, *last_d, *head_p, *temp_p, *current_p = NULL, *last_p; make(deck); //CREAT

我写的21点程序中的deal函数有问题。有人知道发生了什么事吗?当我尝试在main()中打印时,出现了一个分段错误

干杯

主要功能

int main(void)
{
    int i, j, k, purse;
    card deck[52];
    card *head_d, *temp_d, *current_d = NULL, *last_d, *head_p, *temp_p, *current_p = NULL, *last_p;



make(deck);  //CREATES THE DECK
shuffle(deck); //SHUFFLES THE DECK
deal(deck, head_d, current_d, head_p, current_p)

for(i = 0; i < DECK_SIZE; i++)
    {
        printf("%d: %d %c\n", i + 1, deck[i].face, deck[i].suit);
    }

temp_p = head_p;
while(temp_p != NULL)
{
printf("%d %c\n", temp_p->face, temp_p->suit);
temp_p = temp_p->listp;
}

return(0);
}
int main(无效)
{
国际i,j,k,钱包;
卡片组[52];
卡片*head\u d、*temp\u d、*current\u d=NULL、*last\u d、*head\u p、*temp\u p、*current\u p=NULL、*last\p;
制作(套牌);//创建套牌
洗牌(牌);//洗牌
交易(牌组,正面,正面,正面,正面,正面)
对于(i=0;iface,temp\u p->suit);
temp\u p=temp\u p->listp;
}
返回(0);
}
函数deal()

无效交易(卡x[牌组大小]、卡*头d、卡*当前d、卡*头p、卡*当前p)
{
int i;
卡*临时p,*临时d;
对于(i=0;i<4;i++)
{
如果(i%2==0)
{
温度p=(卡*)malloc(卡大小);
温度p->面=x[i]。面;
温度->套装=x[i]。套装;
如果(当前_p==NULL)
{
压头p=温度p;
}
其他的
{
当前\u p->listp=temp\u p;
}
电流p=温度p;
temp\u p->listp=NULL;
}
其他的
{
temp_d=(卡片*)malloc(卡片大小);
温度->面=x[i]。面;
温度->套装=x[i]。套装;
if(当前值=NULL)
{
水头=温度;
}
其他的
{
当前\u d->listp=temp\u d;
}
电流=温度;
temp\u d->listp=NULL;
}
}
}

问题在于
deal
函数的参数是本地的,这意味着当您在函数中更改它们的值时,调用函数时使用的变量将不会更改。您需要通过引用传递这些参数:

该怎么办

*head_p=temp_p;
在函数中设置变量

称为

deal(deck, &head_d, &current_d, &head_p, &current_p);

main
函数中有未初始化的指针变量
head\p
。然而,您正试图读取由
head\p
指向的数据。当然,您会得到segfault。

您能详细说明一下吗。我是否需要在主菜单中声明**标题?或者我可以用我已经声明的内容传递指针吗?@tyson是的,您可以将指针作为指针传递给地址为operator
&
的指针。我已经更新了我的答案。谢谢!我得盯着代码看一段时间才能明白。最后一个问题:在我进行编辑之后,我得到的唯一错误是“162:请求非结构或联合中的成员'listp'。你能理解这一点吗?@tyson因为我没有彻底检查你的代码,我不知道哪些参数需要作为引用传递,所以我将它们都作为引用传递,即指针到指针。这意味着您必须使用指针解引用运算符(一元
*
)来使用这些指针。但是,由于运算符的优先级,您可能必须将取消引用放在括号中,如
(*current\u p)->listp
。谢谢!!你真是个救命恩人。我还发现我的条件语句中有一个错误。没有使用指针<代码>(*当前值=NULL)
。干杯。我正试图在函数deal()中初始化。如果您也在出现分段错误的地方发布主函数,可能会很有用。。或者你可以在哪里调用deal(…)函数。
*head_p=temp_p;
deal(deck, &head_d, &current_d, &head_p, &current_p);