c++ - 线程 1 : EXC_BAD_ACCESS (code =1 address = 0x0)

标签 c++ xcode exc-bad-access

我正在尝试创建一个简单的洗牌和发牌模拟器。我使用一个 vector 来表示一副 52 张牌,每张牌都由结构 BitCard 表示,其元素的空间是内存,受位域限制。但是当构造函数尝试访问 vector 时,xCode 会抛出 BAD_ACCESS 异常: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;

我该如何解决这个问题? 提前致谢!

最佳答案

您正在尝试在构造函数中访问 vector deck的元素。但是当你调用构造函数时,你的deck vector 是空的

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);
    }
}

关于c++ - 线程 1 : EXC_BAD_ACCESS (code =1 address = 0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637022/

相关文章:

c++ - std::list 是否指向同一内存?

ios - 如何在比 9 更旧的 xCode 版本上测试适用于 iOS 11 的应用程序

iphone - Guard Malloc 立即发现 EXC_BAD_ACCESS 错误。为什么不一直使用呢?

c++ - 是否可以删除此条件语句?

c++ - 结构中带有类的链表无法使 bool 操作正常工作

ios - 按下时 UIButton 变淡

swift - iOS Deep Link 不会从 AppDelegate 调用任何函数

ios - 在 swift 中设置 UILabel.text 时的 EXC_BAD_INSTRUCTION

iPhone:无法使用 appDelegate 访问 NSManagedObjectContext

c++ - 到底是什么问题。 else if 逻辑错误?在 else 之前预期的主要表达式