LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1366|回复: 15

怎样通过结构一个成员的地址求出这个结构的地址

[复制链接]
发表于 2005-9-9 13:55:37 | 显示全部楼层 |阅读模式
比如
  1. struct demo {
  2.         int index;
  3.         char content;
  4. }my_demo;
复制代码

如果我只能在程序中得到&my_demo.index,我应该怎样通过这个地址反求出&my_demo
发表于 2005-9-9 14:03:38 | 显示全部楼层
不可能。指针不是双向的。

另外,你既然已经写出了&my_demo.index这样的表达式,为什么不可以写&my_demo?
回复 支持 反对

使用道具 举报

发表于 2005-9-9 14:06:06 | 显示全部楼层
(struct demo*)((char*)&my_demo.index-(int)&((struct demo*)0)->index)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-9 14:30:22 | 显示全部楼层
Post by rickxbx
(struct demo*)((char*)&my_demo.index+(int)&((struct demo*)0)->index)

精彩,谢谢!有三个问题!
1、我的index是int型的,这儿为什么要转换为(char *)?
2、linux的堆栈是向上生成的吧?那么是否应该是-(int)&((struct demo*)0)->index?
3、如果我的成员是结构的第一个成员的话,那么这个成员的地址是不是总是和这个结构的地址相同?在后面的程序中我简单地用第一个成员地地址代替结构地址(当然会类型转换一下)会不会出问题?
回复 支持 反对

使用道具 举报

发表于 2005-9-9 14:39:11 | 显示全部楼层
Post by haohao_h
精彩,谢谢!有三个问题!
1、我的index是int型的,这儿为什么要转换为(char *)?

强转的不是index,而是index的地址,因为后面要减偏移,所以要转成char*.也可以转成int
2、linux的堆栈是向上生成的吧?那么是否应该是-(int)&((struct demo*)0)->index?

不好意思,笔误,已经改过了
3、如果我的成员是结构的第一个成员的话,那么这个成员的地址是不是总是和这个结构的地址相同?

是的.
在后面的程序中我简单地用第一个成员地地址代替结构地址(当然会类型转换一下)会不会出问题?

应该不是出问题,至少我还没想出会出问题的例子.
回复 支持 反对

使用道具 举报

发表于 2005-9-9 16:35:06 | 显示全部楼层
Post by rickxbx
(struct demo*)((char*)&my_demo.index-(int)&((struct demo*)0)->index)

(struct demo*)((char*)&my_demo.index-(char *)&((struct demo*)0)->index)
or
(struct demo*)((char*)&my_demo.index-(unsigned long)&((struct demo*)0)->index)
note:
sizeof(point) <= sizeof(int) is not always true
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-9 16:51:47 | 显示全部楼层
Post by sunmoon1997
(struct demo*)((char*)&my_demo.index-(char *)&((struct demo*)0)->index)
or
(struct demo*)((char*)&my_demo.index-(unsigned long)&((struct demo*)0)->index)
note:
sizeof(point) <= sizeof(int) is not always true

unsigned int就够了吧?不过int出错的几率应该非常小,一般情况下不会有这么大的偏移量吧!
回复 支持 反对

使用道具 举报

发表于 2005-9-9 16:58:55 | 显示全部楼层
Post by haohao_h
unsigned int就够了吧?不过int出错的几率应该非常小,一般情况下不会有这么大的偏移量吧!

确实偏移量不会这么大, 不过做为地址它的长度却有可能大于 int 长度的。 在 64 位机器上这里至少会出现警告的。 所以不要用 int 来作指针运算
回复 支持 反对

使用道具 举报

发表于 2005-9-9 16:59:54 | 显示全部楼层
Post by rickxbx
(struct demo*)((char*)&my_demo.index-(int)&((struct demo*)0)->index)

能不能说一下原理?这个表达式能不能保证在任何机器(例如,大端与小端、堆栈生长方向不同)上正确执行呢?
回复 支持 反对

使用道具 举报

发表于 2005-9-9 17:52:41 | 显示全部楼层
下面是那个表达式的汇编代码,其中 -12(%ebp) 是 my_demo.index,而 -4(%ebp) 是一个指针变量。
  1.         leal        -12(%ebp), %eax
  2.         movl        %eax, -4(%ebp)
复制代码

我实在是看不出什么所以然来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表