使用简单程序访问违规读取位置
Access violation reading location with simple program
好吧,当我遇到一个我以前从未见过的错误时,我正在为类编写一个程序,我不知道该怎么办,只需要很少的调试器使用经验,所以我来到这里希望这里的人能帮我修复这个错误。我的错误是访问违规读取位置。以下是似乎给我错误的代码部分:
#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;
有两件事错了:
- 变量
In
没有足够的空间容纳任何非空字符串 - 即使是这样,也不允许向该空间写信
要解决这个问题,您可以(1)切换到使用std::string
(推荐),或者(2)将C字符串的声明更改为字符数组,如下所示:
char In[128];
相关文章:
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 0xC0000005:读取位置0xCDCDCDC1时发生访问冲突
- 0xC0000005:读取位置0xCDCDCDCD时发生访问冲突
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 0xC0000005:访问冲突读取位置0x0000000000000008
- C++访问冲突读取位置0xDDDDDDCD当我尝试删除已更新的数组时
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- OPENCV.3.0错误:0xc0000005:访问违规读取位置0x00000000
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- vc++ 访问冲突读取位置
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- C++访问冲突读取位置错误
- 访问违规读取位置和错误读取字符串的错误
- C 访问违规读取位置0xcccccccccccccccccccc和卡对象
- C++ 访问向量动态数组中的违规读取位置0xFFFFFFFFFFFFFFFF
- 0xC0000005:访问冲突读取位置0x0000000000000000.C++
- CUDA:访问违规读取位置
- OpenGL:glDrawArrays()引发异常(nvoglv32.dll)读取位置0x00000000时发生访问冲突