gpt4 book ai didi

c - 引用指向结构体的指针,该结构体包含指向结构体指针的指针

转载 作者:行者123 更新时间:2023-11-30 16:00:24 25 4
gpt4 key购买 nike

我很难引用结构内的内存,我不确定我的语法是否正确(尽管考虑其他帖子,我认为我很好)。代码在运行时崩溃。据我所知,我已经分配了所需的内存(52 张卡 - 第 66 行),但我不确定要应用什么类型。我只需要一点插入和指导,非常感谢!

#include <stdio.h>

#define DECK_SIZE (52)

/* the enum suite definition */
enum suite {
diamond = 1,
club,
heart,
spade
};

/* the card definition */
struct card {
int number;
enum suite type;
};

/* the deck definition */
struct deck {
struct card ** cards;
int numCards;
};

/* **
* Name: addCard(deck *myDeck);
* Purpose: Add a card to the deck
** */
void addCard(struct deck * myDeck)
{
int number,suiteType;
printf("Please enter card number: \n");
scanf("%d",&number);
printf("Please enter suite type: \n");
scanf("%d",&suiteType);
/* increase myDeck->numCards by one */
myDeck->numCards += 1;
/* reallocate the block and increase the size by one */
*(myDeck->cards) = (struct card*) realloc ( *(myDeck->cards), sizeof(struct card) * myDeck->numCards);
if ( NULL == *(myDeck->cards) ) {
printf("realloc failed - exiting..\n");
free( *(myDeck->cards));
return;
}
/* put the data */
myDeck->cards[myDeck->numCards-1]->number = number;
myDeck->cards[myDeck->numCards-1]->type = suiteType;
}

/***
* Name: initializeDeck();
* Puspose: create a deck memory block and fill it
***/
struct deck * initializeDeck()
{
struct deck * myDeck;
int num,suite,i;
/* allocate memory for a deck */
myDeck = (struct deck*) malloc ( sizeof(struct deck) );
if (NULL == myDeck) {
printf("Failed to allocate a deck, exiting..\n");
return 0;
}
/* allocte 52 cards */
myDeck->numCards = DECK_SIZE;
myDeck->cards = (struct card**) malloc ( sizeof(struct card) * myDeck->numCards );
if (NULL == *(myDeck->cards)) {
printf("Failed to allocate 52 cards, exiting..\n");
free(myDeck);
return 0;
}
/* fill the deck */
num = 1;
suite=1;
for (i = 0; i<DECK_SIZE; i++) {
myDeck->cards[i]->number = num;
myDeck->cards[i]->type = suite;
num++;
if (num > 13) {
num = 1;
suite++;
}
}
return myDeck;
}

int main()
{
struct deck * myDeck;
myDeck = initializeDeck();
addCard(myDeck);
return 0;
}

最佳答案

乍一看,我看到两件事(这可能无法解决根本原因,但实际上可以帮助编写更多保存代码;-))

1.1 如果初始化失败,您将返回 NULL,但您不会测试 initializeDeck() 的结果,而是调用 addCard,即使 myDeck 是无效的。因此,如果初始化期间出现错误,addCard 会在取消引用 myDeck 时导致崩溃。

要么在main()中执行以下操作:

[...]
if (myDeck)
addCard(myDeck);
[...]

或者甚至更好,就像addCard中的那样:

void addCard(struct deck * myDeck)
{
if (!myDeck) {
printf("invalid input\n");
return;
}
[...]

1.2 malloc() 失败时返回 NULL,因此测试结果并且不要取消引用它:

[...]
myDeck->cards = (struct card**) malloc ( sizeof(struct card) * myDeck->numCards );
if (NULL == myDeck->cards) {
printf("Failed to allocate 52 cards, exiting..\n");
[...]

仔细观察,您会发现您显然不确定如何排列数据......;-)

这一行

myDeck->cards = (struct card**) malloc ( sizeof(struct card) * myDeck->numCards );

应该分配一个指针数组,然后依次为每张卡的条目分配内存分配。

所以有两个错误:

2.1 为引用卡片指针数组的指针分配大量内存。

2.2 您缺少为卡本身分配内存。

要修复 2.1,请将上面的行更改为:

 myDeck->cards = (struct card**) malloc ( sizeof(struct card *) * myDeck->numCards );

要修复 2.2,请将以下内容添加到分配卡片值的循环中。

  [...]
for (i = 0; i<DECK_SIZE; i++) {
myDeck->cards[i] = malloc(sizeof(struct card));
/* adding error checking here is left as an exercise ... */
myDeck->cards[i]->number = num;
[...]

添加这两个修复可以让您走得更远......;-)

提示:与您在添加卡片的代码 (addCard()) 中分配牌组(2.1 和 2.2)时犯的两个错误相同。

顺便说一句:转换 malloc() 的结果对我来说似乎没有必要,因为 malloc() 返回 void * ,它与任何兼容指针。

无论如何,类型转换通常不是一个好主意,因为它使编译器无法将您指向可能不应该的方式。

关于c - 引用指向结构体的指针,该结构体包含指向结构体指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com