c++ - 用简单的程序访问违规阅读位置

标签 c++

好吧,当我遇到一个我以前从未见过的错误并且不知道如何处理它时,我正在为类编写一个程序,使用调试器的经验很少,所以我来这里希望有人这里可以让我走上修复这个错误的道路。我的错误是访问冲突读取位置。这是似乎给我错误的代码部分:

#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* 并且大约 20 年来我一直在使用 C++ 进行编程。你想使用 std::string,例如像这样:

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

您的代码不起作用的原因是输入运算符想要将数据存储在您的指针指向的位置。但是,此指针指向 C 字符串文字的不可变内存。当运算符(operator)试图在此位置存储某些内容时,它会立即遇到访问冲突。

最简单的解决方法是使用 std::string。如果出于某种原因不能使用 std::string,请使用预先分配的 char 数组。如果这样做,请确保通过设置宽度告诉流有多少字符可用:

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

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

关于c++ - 用简单的程序访问违规阅读位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237584/

相关文章:

c++ - 在第一个循环C++之后重置值吗?

c++ - 读取整个文件,然后在同一个 std::fstream 中覆盖所有文件

c++ - 基类构造函数 protected 时在派生类成员函数中创建基类实例

c++ - 设置高 DPI 时防止我的 Win32 应用程序的 UI 元素被放大

python - 在 Python 中编译 C++ 程序时 try catch 由于语法引起的操作系统错误

c++ - 为什么 std::forward 将左值和右值转换为右值引用?

c++ - 如何优化 unordered_map 查找?

c++ - 如何在不终止主应用程序的情况下卸载 ActiveX 的 ocx 以允许覆盖 ocx?

c++ - 是否有必要在 C++ 中调用继承类的公共(public)部分中的宏

c++ - 与 C++ 绑定(bind)时最有效的脚本语言是什么?