vc++奇怪:Access violation reading location 0x529D4EA2.解决方案
vc++奇怪:Access violation reading location 0x529D4EA2.
大家好,今天遇到个问题,感觉个人的能力范围,所以想向大家求助。希望各位大神不吝赐教。
我按照两种方式运行了程序,程序在不同的地方报错。
方式一:

结果是:

报错:
Unhandled exception at 0x5FBC103B (msvcr120.dll) in compress.exe: 0xC0000005: Access violation reading location 0xC0FCDBE8.
方式二:在打印时不访问数组,随便输出了一个字符串,结果报错的 i 位置都不一样了,一个是411,一个是415

结果是:

报错:
Unhandled exception at 0x5FB71D62 (msvcr120.dll) in compress.exe: 0xC0000005: Access violation reading location 0x529D4EA2.
看网上说这种错误很多是内存空间的误读,但是我的调试显示,数组的这个位置是有值的。是不是vs设置的问题呢,我的版本是VS2013.
------解决思路----------------------
我就问一下,你的变量
lengthl和
lengthls
是不是同一个变量?
如无意外就是你拼写错了,数组访问越界呗。
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
------解决思路----------------------
个人经验,多是数组访问越界,建议你把
lengthls,
j,
sizeof(datalong)全部输出来看看
断点一下,注释代码单行调试,应该能找到原因的。
------解决思路----------------------
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
大家好,今天遇到个问题,感觉个人的能力范围,所以想向大家求助。希望各位大神不吝赐教。
我按照两种方式运行了程序,程序在不同的地方报错。
方式一:
结果是:
报错:
Unhandled exception at 0x5FBC103B (msvcr120.dll) in compress.exe: 0xC0000005: Access violation reading location 0xC0FCDBE8.
方式二:在打印时不访问数组,随便输出了一个字符串,结果报错的 i 位置都不一样了,一个是411,一个是415
结果是:
报错:
Unhandled exception at 0x5FB71D62 (msvcr120.dll) in compress.exe: 0xC0000005: Access violation reading location 0x529D4EA2.
看网上说这种错误很多是内存空间的误读,但是我的调试显示,数组的这个位置是有值的。是不是vs设置的问题呢,我的版本是VS2013.
------解决思路----------------------
我就问一下,你的变量
lengthl和
lengthls
是不是同一个变量?
如无意外就是你拼写错了,数组访问越界呗。
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
------解决思路----------------------
个人经验,多是数组访问越界,建议你把
lengthls,
j,
sizeof(datalong)全部输出来看看
断点一下,注释代码单行调试,应该能找到原因的。
------解决思路----------------------
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]
srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}