首页 > 解决方案 > 如何访问指向结构的指针的成员?

问题描述

我试图让指针和 C 更舒服,所以我一直在做练习题。我有一个结构:

typedef struct Card
{
    enum { hearts, spades, clubs, diamonds } suit;
    int value;
} Card;

和一个用于为卡组分配内存的函数:

void createDeck(Card ** deck)
{
    deck = malloc(52 * sizeof(Card *)); //allocate space for deck
    if (deck == NULL)
    {
        fprintf(stderr, "malloc failed\n");
        return;
    }

        //allocate memory for each card in deck
    for (size_t i = 0; i < 52; i++)
    {
        *(deck + i) = malloc(sizeof(Card));
    }
}

我正在尝试使用这样的代码:

int main()
{
    Card *deck = NULL;

    createDeck(&deck);

    printf("%d", deck[0].suit)
}

这给出了一个 nullptr 错误,这让我认为我没有正确分配内存。我改变了不同的东西,但无论如何我都无法让它工作。deck完成工作后如何访问成员createDeck

标签: carraysmemory-managementstruct

解决方案


让我分解你的问题。

main()Card *deck = NULL;将分配一个指针,Card并且该指针指向 NULL。

然后你调用createDeck(&deck);Here 你将指针的地址传递给类型 Card。因此,此地址不是 NULL,因为它指向分配在 Card* 类型堆栈上的指针变量。

这意味着在 中createDeck(),变量deck不会为 NULL,并且将具有有效地址。但是*deck指向指针类型的指针Card*将是NULL。您应该只为*deck.

void createDeck(Card ** deck)
{
    //deck = malloc(52 * sizeof(Card *)); //deck is a double pointer pointing to memory of type Card* allocated on stack in calling function main().
    if (deck == NULL)
    {
        fprintf(stderr, "Null pointer error\n"); //If calling function passes NULL, it means there is some issue.
        return;
    }
    *deck = NULL; //In more complex functions, if there are other logic before doing malloc(), it it better to reset the variables with default values.

        //allocate memory for each card in deck
    //for (size_t i = 0; i < 52; i++)
    //{
    //    *(deck + i) = malloc(sizeof(Card));
    //}

    *deck = malloc(sizeof(Card)*52); //Allocate for all 52 Cards together
    if(NULL == *deck)
    {
        fprintf(stderr, "malloc failed\n");
        return;
    }

    //In case you want to access a card using deck variable.
    (*deck)[2].suit = hearts;
}

推荐阅读