当前位置:  开发笔记 > 编程语言 > 正文

****访问违规阅读位置未处理的异常*******

如何解决《****访问违规阅读位置未处理的异常*******》经验,为你挑选了1个好方法。

我收到错误:"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<

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++;
                }
        }

任何想法将不胜感激.



1> Xirema..:

您的代码中存在许多问题,尤其是在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,这会导致未定义的行为,在您的情况下,会导致访问冲突.

根据上下文,我认为更正后的代码如下所示:

//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 & My_String_Array)
{   
    const std::array 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 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 ")

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有