如何访问指向struct的指针的成员? [重复]

问题描述 投票:3回答:2

这个问题在这里已有答案:

我试图让指针和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的成员?

c arrays memory-management struct
2个回答
3
投票

让我分解你的问题。

main()中,Card *deck = NULL;将分配一个指向Card的指针,指针指向NULL。

然后你调用createDeck(&deck);这里你传递指针的地址键入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;
}

0
投票

没有double pointers,生活将永远更简单,据我所知,你需要一张arry卡(52)?

为什么不呢?

Card* createDeck( )
{
    Card *deck = malloc( 52 * sizeof(Card) );
    {
         printf("OOPS");
    }

    return deck;
}

和来电者

Card *deck = createDeck();
if( !deck )
{
   printf("Alloc Failure");
   exit(0);
}

或者更好地摆脱createDeck并直接打电话给malloc

Card *deck = malloc( 52 *  sizeof(Card));

它是一个完全不同的命题,如果你想要不同的语言,例如甲板是卡的集合

/* That's how a card looks like */
struct Card{
    int value;
    /* waharever else */
};

/* That's a deck */
struct deck {
   struct Card *cards;
};

现在初始化一个甲板

struct deck *createDeck( )
{
     struct deck *deck = malloc( struct deck );
     if( deck )
     {
         deck->cards = malloc( 52 * sizeof(card));
         if(deck->cards)
         {
            /* Do some thing or leavel it as is */
         }
     }

     return deck;
}

和来电者..

struct *deck = createDeck();
if( !deck )
{
    printf("OOps memory");
    exit(0);
}
© www.soinside.com 2019 - 2024. All rights reserved.