gpt4 book ai didi

c++ - 初始化指针数组

转载 作者:行者123 更新时间:2023-11-28 03:46:09 25 4
gpt4 key购买 nike

我有一个 Deck 对象(一副纸牌),它是一个作为双向链表实现的双端队列。我希望能够随意调整队列,但我无法做到这一点。因此,我选择预先洗牌数组和指向卡片的指针,并在事后将它们排入队列。问题是,我现在的代码似乎根本没有初始化指针。

void BuildDeck(Deck* deck) {
Card** cards = new Card*[20];
const size_t MAX_INTEGER_LENGTH = sizeof(int) * 4;
char szPostfix[] = "_Card.bmp";

for(int i = 1; i < 21; i++) {
char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1];
sprintf(path,"%d%s",i, szPostfix);
cards[i-1] = new Card(i,path);
}
ShuffleArray(cards);
for (int i = 0; i < 20; i++) {
deck->PushTop(cards[i]);
}
}

void Swap(Card* a, Card* b) {
Card temp = *a;
*a = *b;
*b = temp;
}

void ShuffleArray(Card** cardArray) {
srand(dbTimer());
for (int i = 0; i < 20; i++)
Swap(cardArray[i],cardArray[rand()%20]);
}

我认为我搞砸的地方是 card[i] = new Card(...) 行,但它在我看来是对的。

如有任何建议,我们将不胜感激。

免责声明:我知道我应该使用标准库来处理大部分内容,但我想先自学一些困难的内容。这就是我学习的方式。

编辑:我修复了索引问题。现在我只需要弄清楚为什么现在没有绘制某些图像...:/感谢您的帮助!

最佳答案

你的代码有很多问题

  1. 您正在使用 1 <= i <= 20 进行循环但对于 20 个元素的数组,索引来自 0 <= index <= 19 .您需要使用 cards[i-1] = new Card(i,path);

  2. 您正在分配指针数组 cards但你没有释放它(内存泄漏)。用 delete[] cards; 释放它完成后或仅将基于堆栈的数组与 Card *cards[20]; 一起使用而不是用 new 分配它.

  3. 您计算 MAX_INTEGER_LENGTH 的方式表明你真的不明白什么sizeof会。

  4. 这就是牌没有被洗牌的原因。您编写了一个交换两个指针的函数,但它交换的指针是函数的局部变量(参数),而不是数组的元素。一种解决方案是通过用 void Swap(Card *& a, Card *& b) 声明交换来将参数作为指针引用 传递,另一种解决方案是将指针传递给指针(但由于双重间接寻址,这需要更复杂的实现语法,并且还需要更改调用函数的方式)。

关于c++ - 初始化指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7618375/

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