**** 访问冲突读取位置处未处理的异常 *******

Posted

技术标签:

【中文标题】**** 访问冲突读取位置处未处理的异常 *******【英文标题】:Unhandled exception at **** Access violation reading location ******* 【发布时间】:2017-01-20 17:20:49 【问题描述】:

我收到错误:“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++;
                
        

任何想法都将不胜感激。

【问题讨论】:

@NathanOliver,您链接的问题与该用户遇到的问题不同。这不是那个问题的重复。 然后简化您的问题 - 尝试从等式中删除 Initialization_Values[value] @NathanOliver 重读代码的第一部分。 My_String_Array 被声明为 string[],而不是 string if(j=6144) 不检查 j 是否等于 6144(它将 6144 分配给 j),因此您的 Index 值可能很快超过 4。 @PeterRitchie - 或者...调试器:P 【参考方案1】:

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

【讨论】:

非常感谢,您的回答很有帮助,非常感谢您的宝贵时间,,

以上是关于**** 访问冲突读取位置处未处理的异常 *******的主要内容,如果未能解决你的问题,请参考以下文章

task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]

访问冲突读取位置0x00000002 [关闭]

0x523d14cf (msvcr100d.dll) 处未处理的异常?

新/删除导致访问冲突

创建链表时访问冲突错误

例外:使用 strcpy_s 时访问冲突写入位置