【问题标题】:"Access violation" error when running C++ program运行 C++ 程序时出现“访问冲突”错误
【发布时间】:2010-11-19 15:47:22
【问题描述】:

我不断收到以下错误:

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,如果这可能会产生任何影响的话。

【问题讨论】:

  • 显然它确实可以编译。如果没有,您将不会拥有Gofish.exe
  • 如果您遇到访问冲突,则代码正在编译。这是一个运行时错误。
  • 这不是编译器错误。编译器错误是当您单击顶部的漂亮箭头时,它无法构建您的 exe。在这里,您的代码显然正在执行自己 ^^

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


【解决方案1】:

因为数组是从零开始的。数组中的最高索引是 51,但您正在尝试访问 52。此外,在您的实现中,永远不会访问索引为 0 的第一张卡。

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

【讨论】:

  • +1。在甲板 [52] 上遇到超出范围的数组异常。我不想添加额外的答案,因为你很好,但我想从编程 101 中补充一点,他们教导 for 循环通常是 for(int i = 0; i
【解决方案2】:

在大小为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。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多