关于结构体的问题

[复制链接]
 楼主| MakeBetter 发表于 2010-4-13 10:45 | 显示全部楼层 |阅读模式
已知一个变量地址,且知道该变量是一结构体的某一变量,现在想通过该地址访问到结构体的其它变量。
以上是可以实现的,比如上将其减掉地址偏移再强制类型转化即可以访问了,但这是不安全的,因为不同的机器(8位、16位、32位)编译时的对齐不一样,造成访问混乱,请问有没有比较安全的方法?
当然,我也用过如下方法,结果是OK了,但不敢确定其安全性,希望大家出出主意,谢谢啦!~
void Action(unsigned char * buff)
{
    int len;
    ActionStruct * Block;
    Block = (MemoryBlock *)(buff);
    while((Block->Data) != buff)
    {
        len = ((Block->Data) - buff);
        Block = (ActionStruct *)((unsigned char *)Block-len);
    }
...
以上是不断比较是否访问对齐好了,才退出,但我不敢保证其它全性,而且方法也太烂啦,哈哈。
airwill 发表于 2010-4-13 12:41 | 显示全部楼层
不赞成这样做, 理由简单, 兜这么大个圈子, 想不出得到什么优势或者好处?
 楼主| MakeBetter 发表于 2010-4-13 13:07 | 显示全部楼层
想一下内存分配的堆怎么实现的吧。
mohanwei 发表于 2010-4-13 13:29 | 显示全部楼层
结构体定义的时候让它对齐即可:
#pragma pack(1)//指定下面的结构体按照1字节对齐
typedef struct
{
        u8 x;
        u16 y;
}asdf;
#pragma pack()//恢复
然后你在程序里取一下它的大小看看:
u16 i=sizeof(asdf);//i=3
 楼主| MakeBetter 发表于 2010-4-13 15:39 | 显示全部楼层
楼上的是一种方法,但想知道
  1. #pragma pack(1)
是否是标准C里有的?或者现在新标准有的呢。谢谢先!
mohanwei 发表于 2010-4-13 16:29 | 显示全部楼层
标准里有的
 楼主| MakeBetter 发表于 2010-4-13 17:32 | 显示全部楼层
哦,谢谢啦!结贴。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

519

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部