Code Bye

C 下数字相减导致数据异常的问题

    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异常了,不知道那位高人对这整个过程能给一个比较清晰明了的解释的。多谢了,看半天还是整的数据没对上。
解决方案

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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C 下数字相减导致数据异常的问题