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; }