使用简单程序访问违规读取位置

Access violation reading location with simple program

本文关键字:读取 位置 访问 简单 程序      更新时间:2023-10-16

好吧,当我遇到一个我以前从未见过的错误时,我正在为类编写一个程序,我不知道该怎么办,只需要很少的调试器使用经验,所以我来到这里希望这里的人能帮我修复这个错误。我的错误是访问违规读取位置。以下是似乎给我错误的代码部分:

#include "Book.h"
using namespace std;
void add (char*, char*, int);
void remove (int&);
void list ();
int Count;

Book Bookshelf [4];
int main ()
{   
    char* In = "";
    char* N = "";
    char* A = "";
    int Y;
    int Num;
    do
    {
        cout << "Bookshelf> ";
        cin >> In;
        if (In == "add")
        {
            cout << "Bookshelf> Enter book: ";
            cin >> N >> A >> Y;
            add (N,A,Y);
        }
        else if (In == "remove")
        {
            cout << "Bookshelf> Select number: ";
            cin >> Num;
            remove (Num);
        }
        else if (In == "list")
        {
        }
    } while (cin != "quit");
    return 0;
}
void add (char* N, char* A, int Y)
{
    if (Bookshelf[4].IsEmpty() == false)
        cout << "Error!" << endl;
    else
    {
        Bookshelf[Count] = Book (N,A,Y);
        Count++;
    }
    cout << "Bookshelf> ";
}

当我在命令行中键入add试图调用add函数时,我遇到了错误,但它会立即发生,所以调试器对我没有帮助。我知道这个问题可能很简单,但我似乎找不到它。如果您能提供任何帮助,我们将不胜感激。如果还需要更多的代码示例,请告诉我。

除非你真的知道自己在做什么,否则不应该使用char*。例如,我很少使用char*,而且我已经用C++编程20年了。您想要使用std::string,例如:

std::string In;
if (std::cin >> In) { ... }

代码不起作用的原因是输入运算符希望将数据存储在指针指向的位置。但是,这个指针指向的是c字符串文字的不可变内存。当操作员试图在该位置存储某些内容时,会立即发生访问冲突。

最简单的修复方法是使用std::string。如果由于任何原因无法使用std::string,请使用预先分配的char数组。如果你这样做,请确保通过设置宽度告诉流有多少字符可用:

char In[16];
if (std::cin >> std::setw(sizeof(In)) >> In) { ... }

(我在这些例子中总是使用检查的原因是,在对结果进行任何操作之前,始终检查输入是否成功是非常重要的)。

不能将数据写入为C字符串文字分配的空间:它们是常量。这就是导致这种行为的部分:

char* In = "";
cin >> In;

有两件事错了:

  1. 变量In没有足够的空间容纳任何非空字符串
  2. 即使是这样,也不允许向该空间写信

要解决这个问题,您可以(1)切换到使用std::string(推荐),或者(2)将C字符串的声明更改为字符数组,如下所示:

char In[128];