调试程序的时候值看不懂

来源:百度知道 编辑:UC知道 时间:2024/07/02 15:16:06
看一个PING程序,中间有一段代码是用来简单检验传送是否出错的。
struct ICMP{
BYTE type;
BYTE code;
WORD cksum;
WORD id;
WORD seq;
char data[4];
};
ICMP icmp;
icmp.type = 8;
icmp.code = 0;
icmp.cksum = 0;
icmp.id = 0;
icmp.seq = count-1;
icmp.data[0] = 'A';
icmp.data[1] = 'B';
icmp.data[2] = 'C';
icmp.data[3] = 'D';
icmp.cksum =checksum(&icmp,sizeof(icmp));
WORD
checksum(void *ptr,int n){
DWORD sum = 0;
WORD *wp =(WORD *)ptr;
while(n > 1){
sum += *wp++;
n-=2;
}
if(n != 0)
sum += *(BYTE *)wp;
sum = (sum>>16) + (sum & 0xFFFF);
return (WORD)~sum;
}
调试的时候看不懂sum的值,希望各位大虾帮忙解释下~~老师说是ASC码相加,我看不懂。。。
我没说清楚,我想说的是sum的取值过程我看不懂。
即:初始化时sum=3435973836,ptr的值为0x0013f5f4(单步调试可看到),ptr每次调试都是这个值,初始化时变量的空间地址不是系统随机分的吗?怎么是固定的?sum的值为什么是这样的呢?而wp初始化时的值为0xcccccccc(为何?)。在wp指向icmp->seq

/*
补充:对不起,这两天一直忙,没来得及处理。

关于ptr的问题,ptr是形参啊,传递给他的值&icmp,icmp每次都是这个,ptr当然每次都是这个了,你调试一下看看。

而icmp是你每次编译调试都是这个值吗?一般应该不是吧。如果是的话,你在ICMP icmp; 这句前面加上一句int a = 1;在看看icmp的地址是不是改变了,要是是的话,就证明icmp每次都是从一个地方分配地址的(栈)。

关于“初始化时变量的空间地址不是系统随机分的”这个问题,我的理解是这样的,我们知道计算机的随机实际上是由一个种子生成的伪随机序列,对于一个种子,每次生成的序列都一样,生成的“随机数”也就是相同的了,所以你的机器生成的“随机地址”都是这个。这里随机性表现在你的机器和我的机器生成的地址是不相关的。当然,如果我们的这个随机序列选择了同一个种子的话,那我们初始的地址也就是一样的了。这点你可以找到很多例子的。

上面主要解释随机的意思,实际上指针的初始地址完全可以不用随机分配,而且这样也更安全,新建指针初始化成0xcccccccc,我这里也是这样的,我认为是编译器做的处理,换一个编译器(C++ Builder、gcc)是不是就变了呢,你可以试试。

“wp的值每次循环加2”,这是个错误的概念,实际上wp++表示wp加sizeof(WORD),所以wp加2,意思是指针每次向后滑动一个WORD(即2BYTE),你在VC6环境下调试
int b;
int *a = b;
a++;
可以看到每次a的值加4,因为sizeof(int)=4。

这样看来,“前面分别指向的是:icmp->type,icmp->code,icmp->cksum,icmp->id”这句话也错了,第一次指向的是icmp->type和icmp->code共同组成的WORD(两者各是一个BYTE),然后依次是icmp->cksum,icmp->id。

后面的问题也好解决了。'A'、'B'各是一个char型字符。占一个BYTE。WORD型指针指