首页 文章

运行C程序时出现“访问冲突”错误

提问于
浏览
2

我一直收到错误:

Gofish.exe中0x5a6fca58(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x0ff3b113 .

我正在尝试运行的代码是:

#include <iostream>
#include <string>
#include<Array>
using namespace std;

class Card{
 string suit;
 int rank;
public:
 Card(int a, string b){
  rank=a;
  suit=b;
 }
 Card(){}
 string getSuit(){
  return suit;
 }
 int getRank(){
  return rank;
 }
};

class Deck{
 Card deck [52];
public:
 Deck(){
  for(int i=1; i<=13; i++){
  deck [i]=Card(i, "spades");
  deck [i*2]=Card(i, "hearts");
  deck [i*3]=Card(i, "diamonds");
  deck [i*4]=Card(i, "clubs");
  }
 }
  void list(){
  for(int i=1; i<=52; i++){
   cout << deck [i].getRank() << " of " << deck [i].getSuit() << endl;
   }
  }
};

int main(){
 Deck deck=Deck();
 deck.list();
 system("pause");
 return 0;
}

我正在使用的编译器是Microsoft Visual C 2010 Express,如果这可能会影响任何东西 .

4 回答

  • 0

    因为数组是零基础的 . 您的数组中的最高索引是51,但您尝试访问52.此外,在您的实现中,将永远不会访问索引0处的第一张卡 .

    deck [i*4-1]=Card(i, "clubs");
    
  • 0

    在大小 52 的数组 deck 中,您尝试使用无效的索引 52 .

    您可以将 for 循环更改为:

    for(int i=0; i<52; i+=4){
        deck [i]   = Card(i, "spades");
        deck [i+1] = Card(i, "hearts");
        deck [i+2] = Card(i, "diamonds");
        deck [i+3] = Card(i, "clubs");
      }
    
  • 3

    这看起来像家庭作业所以我会给你一些提示:

    检查你的for循环逻辑 .

    请记住,数组中的第一个条目是0而不是1 .

  • 6

    除了数组索引溢出问题 . 这可能有问题:

    int main(){
     Deck deck=Deck();
     // ... 
    }
    

    没有必要:你可以简单地写一下 Deck deck; . 但是这样,如果您的编译器没有执行任何优化,您最终可能会尝试使用默认的assingment运算符复制 Deck 对象,该运算符执行成员复制 . 因此,将尝试复制 Card 固定大小的数组,并将一个固定大小的数组复制到另一个不能正常工作 .

相关问题