访问违规阅读位置与简单的程序

时间:2012-02-11 03:30:02

标签: 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函数时,我收到错误,但它立即发生,因此调试器对我没有帮助。我知道问题可能很简单,但我似乎无法找到它。我们将非常感谢您提供的任何帮助。如果需要更多代码示例,请与我们联系。

2 个答案:

答案 0 :(得分:2)

除非你真的知道自己在做什么,否则不应该使用char*。例如,我很少使用char*,而且我用大约20年的时间用C ++编程。您想使用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) { ... }

(我总是在这些例子中使用支票的原因是,在对结果做任何事情之前总是检查输入是否成功非常重要。)

答案 1 :(得分:1)

您无法将数据写入为C字符串文字分配的空间:它们是常量。 这是导致此行为的部分:

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

有两件事是错的:

  1. 您的变量In没有足够的空间容纳任何非空字符串。
  2. 即使这样做,也不允许写入该空间。
  3. 要解决此问题,您可以(1)切换到使用std::string(推荐)或(2)将C字符串的声明更改为字符数组,如下所示:

    char In[128];