| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 362 人关注过本帖
标题:关于结构体的一个问题
只看楼主 加入收藏
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
结帖率:88.89%
收藏
已结贴  问题点数:50 回复次数:3 
关于结构体的一个问题
#include <stdio.h>

typedef struct
{
    char ft1;
    int ft;
}st1;

typedef struct
{
    int z1;
    char z2;
}st2;

st2 as_params;


void test(st1 *as_params_ptr)
{
   
    unsigned char *pch;
    int *pint;
    pch = as_params_ptr;
    pch++;
    pint=pch;
    printf("%x\n",*pint);
    printf("%x\n",as_params_ptr->ft);
}

int main(void)
{
        as_params.z1=0x12345678;
        as_params.z2=0x33;

    test((st1 *)&as_params);  
   
    getch();
}

我的本意是用两个排列顺序不同的结构体来测试交换后的结构,原来以为as_params_ptr->ft应该从第二个字节开始取4个字节,这样跟*pint的结果应该是一样的,结果却出乎意料,
33123456
33
不知道为啥,请大家帮忙分析一下。





[ 本帖最后由 pauljames 于 2012-12-6 19:18 编辑 ]
搜索更多相关主题的帖子: include 结构体 
2012-12-06 19:10
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
对了,会不会是32bit对齐的问题。。。我忽略了。
试过了,确实如此
    printf("%p\n",pint);
    printf("%p\n",&(as_params_ptr->ft));

00404061
00404064

大家随便看看吧,前几个人1人10分好了。。。。。。

[ 本帖最后由 pauljames 于 2012-12-6 19:20 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-12-06 19:14
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:25 
结构体中的数据一般情况下并不是紧挨着的,编译器会进行对齐处理,而且不同编译器对齐的原则往往是不同的。

比如GCC默认会以结构体中的尺寸最大的变量类型来对齐每一个元素。

当然,这种对齐方式是可以干预的,但一般没必要这么做。

所以尽量不要私自通过指针偏移来访问结构体中的元素。

重剑无锋,大巧不工
2012-12-06 19:28
youngdavid
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:698
注 册:2012-9-24
收藏
得分:25 
看看。。
2012-12-06 19:51
快速回复:关于结构体的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016317 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved