簡體   English   中英

在紙牌游戲中檢測到堆棧粉碎 C++

[英]Stack Smashing Detected C++ in Card game

所以我正在編寫一個撲克游戲(因為我很無聊)並且只是設置類並測試它在我前進的過程中工作並且它完美地工作但是突然我添加了一些新代碼來擁有一個實際的甲板而不是無限的隨機卡片,我只是得到這個錯誤

*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

這是來自 mint 19.3 cinnamon 上的 g++ 編譯器

我查看了與我的類似的其他問題,但它們似乎與大量數據有關,我真的不知道在我的程序中是怎樣的。

如果有人可以提供幫助或至少解釋錯誤消息那會很棒

-謝謝

/ 我的代碼 /

#include <iostream>
#include <stdlib.h>

using namespace std;


class Card{
public:
    static Card* deck;
    static int current;
    char house;
    char value;

    void setTo(Card c){
        house = c.house;
        value = c.value;
    }

    void random(){
        setTo(*(deck + current));
        current++;
    }

    void print(){

        switch (value){
            case 11:
                cout << "jack";
                break;
            case 12:
                cout << "queen";
                break;
            case 13:
                cout << "king";
                break;
            case 14:
                cout << "ace";
                break;
            default:
                cout << (int)value;
                break;
        }

        cout << " of ";
        switch (house){
            case 0:
                cout << "spades";
                break;
            case 1:
                cout << "clubs";
                break;
            case 2:
                cout << "hearts";
                break;
            case 3:
                cout << "diamonds";
                break;
            default:
                cout << "there has been an error, the house is invalid";
                break;
        }
        cout << endl;
    }

    static void CreateDeck(){
        Card cs[52];
        deck = &cs[0];

        int k;
        for(int i = 0;i<4;i++){
            for(int j = 0;j<14;j++){
                k =  (i*13) + j;
                deck[k].house = i;
                deck[k].value = (j+1);
            }
        }
    }

    static void ShuffleDeck()
        int j,k;
        Card t;
        for(int i = 0;i<52;i++){
            j = rand() % 52;
            k = rand() % 52;
            t.setTo(*(deck+j));
            (*(deck+j)).setTo(*(deck+k));
            (*(deck+k)).setTo(t);
        }
    }
};

class Player{
    public:
        int chips;
        Card* hand;
        string pName;

        void initialize(string n){
            chips = 1000;
            pName = n;
            Card cs[2];
            hand = &cs[0];
        }

        void print(){
            cout << "player: " << pName << endl;
            cout << "    ";
            (*hand).print();
            cout << "    ";
            (*(hand +1)).print();
            cout << "    " << chips << " chips" << endl;
            cout << endl;
        }

        void deal(){
            (*hand).random();
            (*(hand+1)).random();
        }

};

class Game{
    public:
        int pot;
        Card* deck;

        void initialize(){
            pot = 0;
            Card c[5];
            deck = &c[0];
        }
};

Card* Card::deck = NULL;
int Card::current = 0;

int main()
{

    srand (time(NULL));
    Card::CreateDeck();
    Card::ShuffleDeck();
    Card b[2];
    b[0].random();
    b[1].random();

    b[0].print();
    b[1].print();
    cout << endl;
    return 0;
}

您的問題在createDeck

    Card cs[52];
    deck = &cs[0];

您有deck指向函數中的局部變量。 當函數退出時,變量超出范圍,因此嘗試取消引用deck調用未定義的行為

最簡單的解決方法是使用new動態分配數組:

deck = new Card[52];

並有一個清理例程來delete []內存。

更好的方法是將其定義為std::vector

class Card{
public:
    static std::vector<Card> deck;

...

std::vector<Card> Card::deck(52);

這使您可以更好地控制內存。 然而,您將需要更改任何顯式指針算術並取消對數組下標符號的引用(即*(deck + x) --> deck[x]因為std::vector不支持這些運算符。

同樣在createDesk ,您將在這里結束數組/向量:

for(int j = 0;j<14;j++){

你要少一個:

for(int j = 0;j<13;j++){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM