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