免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 5483 | 回复: 41
打印 上一主题 下一主题

地址减去一个整数时会发生什么情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-06 16:36 |只看该作者 |倒序浏览
最近在看一个sniffer小程序
其中包含这样的代码:
#include <netinet/if_ether.h>;
#include <netinet/ip.h>;
#include <netinet/tcp.h>;
struct
{
    struct ethhdr eth;
    struct iphdr ip;
    struct tcphdr tcp;
    ......
}eh;

struct iphdr *ip;
struct tcphdr *tcp;

ip = (struct iphdr *)((unsigned long *)&eh.ip - 2);
tcp = (struct tcphdr *)((unsigned long *)&eh.tcp - 2);

在使用gdb调试过程中,我打印了一下指针ip,tcp和&eh.ip,&eh.tcp的地址
却发现ip相对于eh.ip的地址来说往前只移动了两个字节
tcp相对于eh.tcp的地址来说也只移动了两个字节
而按照我以前的理解来看,它们都应该向前移动2*sizeof(unsigned long)字节的长度,也就是各移动8个字节才对阿?

这个问题第一次碰到,盼指教,我已经写了好久的测试程序了,碰到一些其他意外情况,我需要一个总结来综合一下指针和数字做减法时可能发生的情况。

论坛徽章:
0
2 [报告]
发表于 2005-08-06 16:41 |只看该作者

地址减去一个整数时会发生什么情况

+1 -1 就是加一减一,和指针数据类型没有关系

论坛徽章:
0
3 [报告]
发表于 2005-08-06 16:46 |只看该作者

地址减去一个整数时会发生什么情况

ip = (struct iphdr *)((unsigned long *)&eh.ip - 2);
tcp = (struct tcphdr *)((unsigned long *)&eh.tcp - 2);
这样?

论坛徽章:
0
4 [报告]
发表于 2005-08-06 16:50 |只看该作者

地址减去一个整数时会发生什么情况

恩呢~~~

就是这样啊

我写了几个测试程序,分别得出不同情况

主要是面对结构体时的异常情况

如果这个问题能解决的话,我马上就要问下一个问题:

为什么在定位ip帧头和tcp帧头时要先减二呢?

是不是最开始声明的那个结构packet_header抓到的包跟实际的包相差两个字节?

论坛徽章:
0
5 [报告]
发表于 2005-08-06 16:51 |只看该作者

地址减去一个整数时会发生什么情况

(unsigned long)&eh.ip只是个整数, 减去2当然就是单纯的减去2嘛,因为他不是指针你如果要拿他作指针用,你必需先强制转换成那个类型的指针啊,你少了个" * "号(外面的那个在减完以后强制转换已经没效果了),看看是不是这样的

论坛徽章:
0
6 [报告]
发表于 2005-08-06 16:54 |只看该作者

地址减去一个整数时会发生什么情况

哦嘎嘎

不好意思,那是我的笔误,抄程序时不小心写错了

编辑过了

指针减去一个整数的规则到底是什么?

论坛徽章:
0
7 [报告]
发表于 2005-08-06 16:55 |只看该作者

地址减去一个整数时会发生什么情况

你可比较一下
  1. char a[5]={0,1,2,3,4};
  2. char *p=a;
  3. printf("%p,%p\n",p,p+1);
复制代码
  1. int b[5]={0,1,2,3,4};
  2. char *q=b;
  3. printf("%p,%p\n",q,q+1);
复制代码

指针加1加的大小就是指针指向的类型的所占的字节数

论坛徽章:
0
8 [报告]
发表于 2005-08-06 17:02 |只看该作者

地址减去一个整数时会发生什么情况

还是顶楼的问题阿~~~
这样一段程序:
char *ptr = "abcdefg";
int *integer;
integer = (int *)ptr;
integer ++;
printf("%s\n", integer);

这段程序的输出应该是:efg
也就是用一个整型指针指向原先的一段字符串首地址,那么讲该指针加一的话,指针要相应往后移动4个字节

在我顶楼的例子中,程序首先通过(unsigned long *)&eh.ip将eh.ip占用的那段地址空间转换成unsigned long *型,然后将其减2,这时候指针却紧紧向前移动了2个字节,为什么不是8个字节呢?

论坛徽章:
0
9 [报告]
发表于 2005-08-06 17:05 |只看该作者

地址减去一个整数时会发生什么情况

[quote]原帖由 "dustman" 发表:
还是顶楼的问题阿~~~
这样一段程序:
char *ptr = "abcdefg";
int *integer;
integer = (int *)ptr;
integer ++;
printf("%s\n", integer);

这段程序的输出应该是:efg
也就是用一个整型指针指向原先的一

论坛徽章:
0
10 [报告]
发表于 2005-08-06 17:06 |只看该作者

地址减去一个整数时会发生什么情况

你再测试下看看,在我这里没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP