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

时间:2010-11-19 03:06:42

标签: c++ arrays visual-studio-2010 access-violation runtime-error

我一直收到错误:

  

0x5a6fca58处的未处理异常   Gofish.exe中的(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 :(得分:6)

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

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

答案 1 :(得分:3)

在大小为deck的数组52中,您尝试使用无效的索引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");
  }

答案 2 :(得分:0)

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

检查你的for循环逻辑。

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

答案 3 :(得分:0)

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

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

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