**** 访问冲突读取位置处未处理的异常 *******
Unhandled exception at **** Access violation reading location *******
我收到错误:"Unhandled exception at 0x00d23737 in Test.exe: 0xC0000005: Access violation reading location 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
,然后将 (non-zero) 值提升为布尔值,这使得 if 语句始终执行,这意味着 Index
始终递增。在循环的 5 次迭代中,Index
增加到超过 Initialization_Values
的大小,这会导致未定义的行为,并且在您的情况下会导致访问冲突。
根据上下文,我认为更正后的代码如下所示:
//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-style 数组通常被认为是 C++ 中的不良做法,而您的代码完美地 case-study 说明了原因。 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;
的内容。摆脱它。 It's bad practice 并使您的代码更难为其他用户解释(“是 string
自定义类型还是 std::string
?”)
我收到错误:"Unhandled exception at 0x00d23737 in Test.exe: 0xC0000005: Access violation reading location 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
,然后将 (non-zero) 值提升为布尔值,这使得 if 语句始终执行,这意味着Index
始终递增。在循环的 5 次迭代中,Index
增加到超过Initialization_Values
的大小,这会导致未定义的行为,并且在您的情况下会导致访问冲突。
根据上下文,我认为更正后的代码如下所示:
//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-style 数组通常被认为是 C++ 中的不良做法,而您的代码完美地 case-study 说明了原因。 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;
的内容。摆脱它。 It's bad practice 并使您的代码更难为其他用户解释(“是 string
自定义类型还是 std::string
?”)