初始化指针数组

Initializing array of pointers

本文关键字:数组 指针 初始化      更新时间:2023-10-16

我有一个Deck对象(Deck of cards),它是一个双端队列,实现为双链表。我希望能够随意洗牌,但我不知道该怎么做。因此,我选择预先洗牌一个数组和指向牌的指针,并在洗牌后将它们排队。问题是,我现在的代码似乎根本没有初始化指针。

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(...)行,但不知怎么的,它看起来对我来说是正确的。

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

免责声明:我知道我应该使用标准库来处理大多数这些东西,但我正在尝试先教自己最难的东西。这就是我学习的方式。

EDIT:我修复了索引问题。现在我只是想弄清楚为什么有些图像现在不画了……/谢谢你的帮助!

你的代码有很多问题

  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)声明swap来传递参数作为指针引用,另一种解决方案是将指针传递给指针(但这将需要更复杂的实现语法,因为双间接并且还需要改变调用函数的方式)。

在第一个for循环中起始索引为0,而在第二个for循环中起始索引为0。这可能就是问题所在。

代码:

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

这里的循环应该从020开始:

 for(int i = 1 ; i < 21; i++) //incorrect - original code
 for(int i = 0 ; i < 20; i++) //correct - fix

修复后,您可以使用i+1代替i:

        sprintf(path,"%d%s",i+1, szPostfix);
        cards[i] = new Card(i+1,path);