线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)
Thread 1: EXC_BAD_ACCESS (code =1 address = 0x0)
我正在尝试创建一个简单的洗牌和发牌模拟器。我使用一个向量来表示一副52张卡片,每张卡片由结构BitCard
表示,其元素的空间是由位字段限制的内存。但是,当构造函数尝试访问向量时,xCode会抛出一个BAD_ACCESS exception: Thread 1: EXC_BAD_ACCESS (code =1 address = 0x0)
。我做了一些研究,发现这个异常与一个空指针有关,但似乎不知道如何修复它。我的代码如下:
#include <iostream>
#include <cctype>
#include <cstdlib>
#include <vector>
#include <iomanip>
using namespace std;
struct BitCard{
unsigned face:4;
unsigned color:1;
unsigned suit:2;
};
class DeckOfCards {
public:
static const int faces = 13;
static const int colors = 2;
static const int numberOfCards = 52;
DeckOfCards();
void shuffle();
void deal();
private:
vector <BitCard> deck={};
};
DeckOfCards::DeckOfCards(){
for (int i = 0; i <numberOfCards;++i){
deck[i].face = i%faces;
deck[i].suit = i/faces;
deck[i].color = i/(faces*colors);
}
}
void DeckOfCards:: shuffle(){
for (int i = 0; i <numberOfCards;i++){
int j = rand()%numberOfCards;
BitCard tmp = deck[i];
deck[i] = deck[j];
deck[j] = tmp;
}
}
void DeckOfCards:: deal(){
for (int k1 = 0, k2 = k1+numberOfCards/2;k1<numberOfCards/2-1;k1++,k2++)
{
cout << "Color:" << setw(3) << deck[k1].color
<< " Card:" << setw(3) << deck[k1].face
<< " Suit:" << setw(3) << deck[k1].suit
<< " Color:" << setw(3) << deck[k2].color
<< " Card:" << setw(3) << deck[k2].face
<< " Card:" << setw(3) << deck[k2].suit;
}
}
int main(int argc, const char * argv[]) {
DeckOfCards testDeck;
testDeck.shuffle();
testDeck.deal();
return 0;
}
异常在行中生成
deck[i].face = i%faces;
我该怎么解决这个问题?提前感谢!
您正试图访问构造函数中向量deck
的一个元素。但是当你调用构造函数时,你的deck
向量是空的
vector <BitCard> deck={}; // <- empty deck
DeckOfCards::DeckOfCards(){
for (int i = 0; i <numberOfCards;++i){
deck[i].face = i%faces; // <- At construction time, you are trying to access deck with index i. but Deck is empty!
//...
}
}
一种解决方案是构造对象BitCard
并将其推送到vector
DeckOfCards::DeckOfCards(){
for (int i = 0; i <numberOfCards;++i){
BitCard myBitCard;
myBitCard.face = i%faces;
myBitCard.suit = i/faces;
myBitCard.color = i/(faces*colors);
deck.push_back(myBitCard);
}
}
deck
矢量的大小始终为0。使用[]
对向量进行索引不会自动调整向量大小以容纳无效索引。
您可以将其初始化为正确的大小。
vector <BitCard> deck(numberOfCards);
或者在构造函数中调整它的大小。
DeckOfCards::DeckOfCards(){
deck.resize(numberOfCards);
或者,您可以在构造函数的循环中使用push_back
将每个新卡添加到向量的末尾。
DeckOfCards::DeckOfCards(){
for (int i = 0; i <numberOfCards;++i){
BitCard card;
card.face = i%faces;
card.suit = i/faces;
card.color = i/(faces*colors);
deck.push_back( card )
}
}
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的
- 线程 1:xcode 中出现EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)错误
- c++ Valgrind:地址0x0不是堆叠的、恶意的或(最近)释放的
- Xcode:线程1:exc_bad_access(代码= 1,地址= 0x0)在缩短列表时
- 线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)错误
- 如何检查指针指向的地址是否0x0?
- C++:尝试将新节点添加到链表会产生"线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)"错误
- 线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)问题生成
- 线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)
- 错误的重新定位地址0x0在 python.data C 扩展中
- 映射两个矢量元素并得到EXC_BAD_ACCESS(代码= 1,地址= 0x0)错误
- 段故障。地址0x0不是堆叠的、恶意的或(最近)释放的