c++访问冲突写入位置0x00000000

C++ Access violation writing location 0x00000000

本文关键字:位置 0x00000000 访问冲突 c++      更新时间:2023-10-16

是的,这是家庭作业,但我不知道如何通过这个错误。我必须使用一个类来创建和洗牌一副牌,然后输出花色和值。当我第一次运行程序时,错误弹出。任何帮助将不胜感激!

这是卡片类:

#include "Card.h"
void Card::Set(int suit, int value)
{
m_Suit = suit;
m_Value = value;
//set the appropriate member variable
}
string Card::GetSuit()
{
if (m_Suit = 0){
    return "Spades";
}
else if (m_Suit = 1){
    return "Hearts";
}
else if (m_Suit = 2){
    return "Diamonds";
}
else if (m_Suit = 3){
    return "Clubs";
}
//returns suit based on suit variables's number
}
string Card::GetValue()
{
if (m_Value = 0){
    return "Ace";
}
else if (m_Suit = 1){
    return "2";
}
else if (m_Suit = 2){
    return "3";
}
else if (m_Suit = 3){
    return "4";
}
else if (m_Suit = 4){
    return "5";
}
else if (m_Suit = 5){
    return "6";
}
else if (m_Suit = 6){
    return "7";
}
else if (m_Suit = 7){
    return "8";
}
else if (m_Suit = 8){
    return "9";
}
else if (m_Suit = 9){
    return "10";
}
else if (m_Suit = 10){
    return "Jack";
}
else if (m_Suit = 11){
    return "Queen";
}
else if (m_Suit = 12){
    return "King";
}
//return value based on value variable's number
}

这是我的主要功能:

#include <iostream>
#include <string>
#include <time.h>
#include "Card.h"
using namespace std;
void RandomizeSeed();
int RandomRange(int min, int max);
void SwapCards(Card* a, Card* b);
//function declarations
int main()
{
RandomizeSeed();
//for a random number later
const int decknum = 52;
//# of cards in a deck
Card *deck[decknum] = {};
//a deck of card classes...?
for (int i = 0; i <= decknum; i++){
    float suit = i/13;
    float value = i%13;
    deck[i]->Set((suit), (value));
    //assign value to each card of the deck
}
for (int i = 0; i <= decknum*2; i++){
    SwapCards(deck[RandomRange(0, 51)], deck[RandomRange(0, 51)]);
    //shuffle cards
}
for (int i = 0; i <= decknum; i++){
    cout << deck[i]->GetSuit() << "of "<< deck[i]->GetValue() << endl;
//output the shuffled deck
}

for (int i = 0; i <= decknum*1; i++){
    delete deck[i];
    deck[i] = nullptr;
    //delete the cards
}
system("pause");
return 0;
}
void SwapCards(Card* a, Card* b)
{
Card temp = *a;
*a = *b;
*b = temp;
}//swap 2 cards to shuffle
void RandomizeSeed()
{
srand(time(NULL));
}
int RandomRange(int min, int max)
{
int randomValue = rand() % (max + 1 - min) + min;
return randomValue;
} //random number function

你从不初始化卡片。

Card *deck[decknum] = {};

将把deck初始化为0。任何时候在其中一个条目上调用Set都会得到一个写异常。虽然你有delete each card循环

因此,您需要在初始化循环中添加一个分配,就在上面的行之后:
for (int i = 0; i < decknum; i++){ // < not <=
    deck[i] = new Card(); //<-- add this line
    float suit = i/13;
    float value = i%13;
    deck[i]->Set((suit), (value));
}

正如vsoftco指出的那样,Set和Get方法中的所有if语句都应该是==而不是=.

有人在评论中指出了一些错误。我将添加这个:

const int decknum = 52;
Card *deck[decknum] = {};
for (int i = 0; i <= decknum; i++){

声明了一个包含52个元素的数组。有效的索引是从0到51,而不是52,所以正确的for循环是:

for (int i = 0; i < decknum; i++){

即用<代替<=。使用<=,您将访问超出其边界的数组,导致未定义的行为,例如处理错误的数据甚至使程序崩溃。

并且,正如Igor所说,您有一个不指向对象的指针数组。为此,您必须使用new。我只是想补充一点,很容易看出有一个错误,因为在程序的最后你调用了delete,但你从来没有调用过new

vsoftco发现的错误(我没有看到)表明您没有阅读编译器警告,或者它们被禁用。请启用它们并阅读它们。即使对于经验丰富的程序员来说,这也是一个很好的习惯。