初始化指针数组
Initializing array of pointers
我有一个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 <= i <= 20
循环,但对于20个元素的数组,索引从0 <= index <= 19
开始。您需要使用cards[i-1] = new Card(i,path);
-
你正在分配指针数组
cards
,但你没有释放它(内存泄漏)。要么用delete[] cards;
释放它,一旦你完成了,或者只是使用Card *cards[20];
的堆栈数组,而不是用new
分配它。 -
你计算
MAX_INTEGER_LENGTH
的方式表明你并不真正理解sizeof
的作用。 -
这就是为什么牌没有被洗牌的原因。你写了一个函数来交换两个指针,但是它要交换的指针是函数的局部变量(参数),而不是数组的元素。一种解决方案是通过与
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);
}
这里的循环应该从0
到20
开始:
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);
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”