尝试显示对象数组时出现运行时错误

Runtime error when trying to display array of objects

所以,我正在尝试用 C++ 创建纸牌游戏,在尝试确保我的数组正常工作时,我遇到了一个运行时错误,其中显示:

在 Sabacc.exe 中的 0x7AD940D9 (vcruntime140d.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x0BFE1052.

我不知道这个错误的实际含义,但这是我的代码,您可以看到发生了什么:

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

class cards {
public:
    string suit;
    int number = 0;
};

int main(int argc, char** argv) {
    /*Initialise Arrays*/
    cards Card[60];

    //initialise Vars
    string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
    int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

    //Define Card Values
    for (int c = 1; c < 61; c++) {

        if (c >= 1 && c <= 15) {
            Card[c].suit = "Coins";
            Card[c].number = c;
        }
        else if (c >= 16 && c <= 30) {
            Card[c].suit = "Flasks";
            Card[c].number = c - 15;
        }
        else if (c >= 31 && c <= 45) {
            Card[c].suit = "Sabers";
            Card[c].number = c - 30;
        }
        else if (c >= 46 && c <= 61) {
            Card[c].suit = "Staves";
            Card[c].number = c - 45;
        }

    }

    for (int i = 1; i < 60; i++) {
        cout << Card[i].number << " " << Card[i].suit << endl;
    }

    return 0;
}

如果你能帮忙,那就太好了。我是一个完全的初学者,所以我可能缺少一个非常明显的答案。

    for (int c = 1; c < 61; c++) {

off-by-one error 这里。数组cards Card[60];只有60个元素(Card[0]Card[59]),所以一定不能访问Card[60].

由于您在打印循环中只使用Card[1]Card[59],所以您应该根据此调整第一个循环。

也就是说条件c < 61应该改成c < 60.

另一种选择是将 cards Card[60]; 更改为 cards Card[61];(再添加一个元素)并(可选)将第二个循环的条件 i < 60 更改为 i < 61

Card[0] 未使用,但我认为在具有足够内存的现代 PC 上浪费几个字节的一个元素是可以的,以通过从 1 开始索引来提高可读性 and/or 简单性。

卡片结构分配索引0-59。在第一次迭代中,循环没问题,但为了更好地理解,我做了一些修改。您可以了解正在分配哪些索引。在 print 语句中,如果您不想显示“0”,您可以从 1 开始循环。主要错误出现在第 25 行 for (int c = 1; c < 61; c++) {

看看下面的完整代码:

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or 
input loop */

class cards {
public:
  string suit;
  int number = 0;
 };

int main(int argc, char** argv) {
 /*Initialise Arrays*/
 cards Card[60]; //indexes 0-59 gets allocated

 //initialise Vars
string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

//Define Card Values
for (int c = 0; c < 60; c++) { //iterate 0-59 i.e 60 elements

    if (c >= 1 && c <= 15) {
        Card[c].suit = "Coins";
        Card[c].number = c;
    }
    else if (c >= 16 && c <= 30) {
        Card[c].suit = "Flasks";
        Card[c].number = c - 15;
    }
    else if (c >= 31 && c <= 45) {
        Card[c].suit = "Sabers";
        Card[c].number = c - 30;
    }
    else if (c >= 46 && c <= 61) {
        Card[c].suit = "Staves";
        Card[c].number = c - 45;
    }

}

for (int i = 0; i < 60; i++) { //prints 0-59 i.e 60 elements
    cout << Card[i].number << " " << Card[i].suit << endl;
}
return 0;

}