C++出现Read Access Violation错误,求解释及代码问题排查
首先给你讲清楚Read Access Violation到底是什么:这个错误说白了就是你的程序在试图读取一块它没权限碰的内存——要么这块内存根本没被分配给你的程序,要么已经被释放了,系统为了保护内存安全,直接给你抛出这个错误终止程序。
接下来看你代码里的几个致命问题:
数组越界访问(直接触发错误的元凶)
你定义了char word[32] = "";,这意味着这个数组只有32个元素(索引从0到31),但你的循环里b的取值范围是0到91,当b超过31的时候,你就开始往数组外面的内存写数据了,这直接触发了访问冲突——系统不允许你乱碰不属于你的内存。字符串比较逻辑完全错误
你写的if (word == Password)根本不是在比较字符串内容!word是char数组,在表达式里会退化成指针,Password是std::string,这里的==是在比较word数组的首地址和Password对象的内部地址,永远不可能相等。正确的做法是把word转成std::string再比:if (std::string(word) == Password),或者用C风格的strcmp(word, Password.c_str()) == 0。循环逻辑混乱,未初始化内存访问
你初始化word的时候只把第一个元素设为\0,后面的31个元素都是未初始化的垃圾值。而且你的嵌套循环逻辑完全不对:比如word[b] = fullset[c];之后马上比较,但此时word的其他位置都是脏数据,这样的比较没有任何意义,还可能因为访问未初始化内存触发错误。另外,你的循环层级和密码长度的关联逻辑也混乱,根本没法正确生成所有可能的密码组合。
简单的修复思路
- 别用固定大小的char数组了,直接用
std::string来存储尝试的字符串,自动管理内存,避免越界问题。 - 重新梳理暴力破解的逻辑:对于长度为
Passwordlen的密码,你需要生成所有长度相同的字符组合——可以用多层循环(如果密码长度固定)或者递归(支持任意长度),每一位从fullset里取字符,组合成完整字符串后再和目标密码比较。 - 一定要用正确的字符串比较方式,别再拿指针地址比了。
内容的提问来源于stack exchange,提问作者Alvaro Habet Hulse

