首页 文章

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

提问于
浏览
-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<<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++;
                }
        }

任何想法将不胜感激 .

1 回答

  • 5

    您的代码中存在许多问题,尤其是在 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<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 ?”)

相关问题