打印

关于结构体的问题

[复制链接]
1580|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

使用特权

评论回复
5
MakeBetter|  楼主 | 2010-4-13 15:39 | 只看该作者
楼上的是一种方法,但想知道
#pragma pack(1)
是否是标准C里有的?或者现在新标准有的呢。谢谢先!

使用特权

评论回复
6
mohanwei| | 2010-4-13 16:29 | 只看该作者
标准里有的

使用特权

评论回复
7
MakeBetter|  楼主 | 2010-4-13 17:32 | 只看该作者
哦,谢谢啦!结贴。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

506

帖子

0

粉丝