***读取位置*******的访问冲突处出现未处理的异常
Unhandled exception at **** Access violation reading location *******
我得到错误:"Test.exe中0x00d23737处未处理的异常:0xC0000005:读取位置0x8a8c0344的访问冲突"当我执行以下代码时会发生这种情况:
int main(int argc, char* argv[])
{
string My_String_Array[30720];
Initialize_My_String_Array (My_String_Array); //i really doubt that there is something wrong in the definition of this function
for (int i=0;i<=30719;i++)
{
cout<<My_String_Array[i]<<endl;
}
system("pause");
return 0;
}
Initialize_My_String_Array()的代码如下:
void Initialize_My_String_Array (My_String_Array[30720])
{
string Initialization_Values[]={"A","B","C","D","E"};
int Index=0;
int i=0;
int j=0;
while (i<=30719)
{
My_String_Array[i]=Initialization_Values[Index];
i++;
j++;
if (j=6144)
{
j=0;
Index++;
}
}
任何想法都将不胜感激。
您的代码中存在许多问题,尤其是在Initialize_My_String_Array
中。
void Initialize_My_String_Array (My_String_Array[30720])
{
string Initialization_Values[]={"A","B","C","D","E"};
int Index=0;
int i=0;
int j=0;
while (i<=30719){
My_String_Array[i]=Initialization_Values[Index];
i++;
j++;
if (j=6144){
j=0;
Index++;
}
}
}
- 您的方法签名不正确。您已经声明了一个变量
My_String_Array[30720]
,但还没有给它一个类型。从上下文来看,我认为类型应该是std::string
- 在
if
语句中,您已经编写了if(j = 6144)
。=
不是相等运算符,而是赋值运算符。==
是相等运算符。您的代码将6144分配给j
,然后将(非零)值提升为布尔值,这将使if语句始终执行,这意味着Index
始终递增。在循环的5次迭代中,Index
的增量超过了Initialization_Values
的大小,这会导致Undefined Behavior,在您的情况下,还会导致访问冲突
根据上下文,我认为更正后的代码如下所示:
//Type is now correctly defined.
void Initialize_My_String_Array (string My_String_Array[30720])
{
string Initialization_Values[]={"A","B","C","D","E"};
int Index=0;
int i=0;
int j=0;
while (i<=30719){
My_String_Array[i]=Initialization_Values[Index];
i++;
j++;
if (j == 6144){
j=0;
Index++;
}
}
}
除此之外,您还需要花一些时间重新评估您是如何编写此代码的。C风格数组在C++中通常被认为是一种糟糕的做法,您的代码是一个完美的案例研究。C++std::array
对象要优越得多,对于任何类似的代码来说都应该是首选对象。除此之外,您还沉迷于一些涉及索引和数组边界的意大利面条代码。有更好的方法来处理它。我已经写了一个我认为更好的版本的代码:
void Initialize_My_String_Array (std::array<std::string, 30720> & My_String_Array)
{
const std::array<std::string, 5> Initialization_Values{"A","B","C","D","E"};
const size_factor = (My_String_Array.size() / Initialization_Values.size());
for(size_t index = 0; index < My_String_Array.size() && (index / size_factor) < Initialization_Values.size(); index++) {
My_String_Array[index] = Initialization_Values[index / size_factor];
}
}
int main(int argc, char* argv[]) {
std::array<std::string, 30720> My_String_Array;
Initialize_My_String_Array (My_String_Array);
for(std::string const& s : My_String_Array) {
std::cout << s << std::endl;
}
system("pause");
return 0;
}
还有一件事:在代码的某个地方,您已经编写了类似using namespace std;
的内容。去掉它。这是一种糟糕的做法,会使您的代码更难为其他用户解释(">string
是自定义类型还是std::string
?")
相关文章:
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- C++ 程序中双链表的未处理异常
- 运算符重载时未处理<<异常
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- ImageMagick 的未处理异常
- 类数组大小为的未处理异常
- 尝试将构造函数设置为 0 - c++ 的未处理异常
- Dijkstra 中0x001e1078 s_Algorithm.exe的未处理异常:0xC0000005:访问冲突读取位置0xbaadf00d
- 运算符重载未处理异常
- 尝试使用 fread 读取文本文件时发生 'System.AccessViolationException' 类型的未处理异常
- c++中的Guard,在main中未处理异常时不调用析构函数
- 某些内存位置的未处理异常
- 错误 linkedlist .exe 中0x00D0345E处的未处理异常: 0xC0000005:访问违规写入位置0x
- 仅在发布模式下使用 glGenBuffer 的未处理异常 - QT
- 如何分析VS2010在调试模式下捕获的未处理异常
- glDrawArrays上的openGL未处理异常(GL_TRIANGLES,0,model.indicesCount)
- 使用Boost Spirit解析语法的未处理异常
- 解析"%Z" C++ 中将错误作为访问 voilation 的未处理异常给出?
- 为什么在win32计时器回调中引发的未处理异常未被调试器视为未处理异常