int ttt = unsigned short x -((unsigned long)char* y – (unsigned long)char* z) -sizeof(aaa);
上面 unsigned short x = 1369,char *y = 0x7fd33d232036,char*z = 0x7fd322e86800 , sizeof(aaa) = 22;
按照正常的理解,上面的等式 1369 – (0x7fd33d232036 – 0x7fd322e86800)- 22 = -440054515
现在 这个值很异常, ((unsigned long)char* y – (unsigned long)char* z) = 440055862;
而 ttt = unsigned short x -((unsigned long)char* y – (unsigned long)char* z) = 440055862 = 18446744073269497123;
感觉像是原因是 -440054515,原因是反码,补码只写过程,按unsigned long,解释成了一个很大的正数,最后这个数,又按int取截取和解释数据,导致最后看到ttt异常了,不知道那位高人对这整个过程能给一个比较清晰明了的解释的。多谢了,看半天还是整的数据没对上。
上面 unsigned short x = 1369,char *y = 0x7fd33d232036,char*z = 0x7fd322e86800 , sizeof(aaa) = 22;
按照正常的理解,上面的等式 1369 – (0x7fd33d232036 – 0x7fd322e86800)- 22 = -440054515
现在 这个值很异常, ((unsigned long)char* y – (unsigned long)char* z) = 440055862;
而 ttt = unsigned short x -((unsigned long)char* y – (unsigned long)char* z) = 440055862 = 18446744073269497123;
感觉像是原因是 -440054515,原因是反码,补码只写过程,按unsigned long,解释成了一个很大的正数,最后这个数,又按int取截取和解释数据,导致最后看到ttt异常了,不知道那位高人对这整个过程能给一个比较清晰明了的解释的。多谢了,看半天还是整的数据没对上。
解决方案
40
判断能否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。假如该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#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;
}