免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4051 | 回复: 10

[C] 结构体字符对齐问题 [复制链接]

论坛徽章:
0
发表于 2008-07-05 12:02 |显示全部楼层
代码:
#include <stdio.h>
#include <unistd.h>

struct st {
    int id;
    char ch;
    char name[10];
    double db;
};

main()
{
    int id;
    struct st stu={9,'c',"name",3.14};
    char ch;
    char name[11];
    double db;

    printf("sizeof sturct=%d\n",sizeof(struct st)); //==24


    memcpy(&id,&stu,sizeof(int));
    printf("id=%d\n",id);

    memcpy(&ch,(char *)&stu+sizeof(int),4);
    printf("ch=%c\n",ch);

    //memcpy(name,(char *)&stu+sizeof(int)+2,10);               /* 1 */
    memcpy(name,(char *)&stu+sizeof(int)+1,10);
    printf("name=%s\n",name);

    //memcpy(&db,(char *)&stu+sizeof(int)+1+10,sizeof(double)); /* 2 */
    memcpy(&db,(char *)&stu+16,sizeof(double));
    printf("db=%lf\n",db);
}

上面代码执行结果正确,哪位高人解析一下为什么注释的两行是错误的?

论坛徽章:
0
发表于 2008-07-05 12:11 |显示全部楼层
IA32的类型长度gcc的,自己想一下对齐吧
char 1
short 2
int 4
long 4
long long 8
float 4
double 8
long double 12
pointer 4

论坛徽章:
0
发表于 2008-07-05 12:18 |显示全部楼层
sizeof(struct st) = 24
是4+2+10+8
还是4+1+11+8 ?

论坛徽章:
0
发表于 2008-07-05 12:27 |显示全部楼层

回复 #3 rock_jq 的帖子

你打印每个元素的地址啊

论坛徽章:
0
发表于 2008-07-05 12:30 |显示全部楼层
原帖由 rock_jq 于 2008-7-5 12:18 发表
sizeof(struct st) = 24
是4+2+10+8
还是4+1+11+8 ?



4+1+11+8
也即是说name是紧跟着ch的, 它们之间没有空隙.

论坛徽章:
0
发表于 2008-07-05 12:45 |显示全部楼层

回复 #5 scutan 的帖子

你剥夺了人家自己思考的机会。

论坛徽章:
0
发表于 2008-07-05 15:16 |显示全部楼层
原帖由 prolj 于 2008-7-5 12:27 发表
你打印每个元素的地址啊

谢谢,刚刚没有想到这点,再问一下
struct st {
    int  id;
   char ch;
    char name[10];
    double db;
};
sizeof(struct st) = 24

struct st {
    int  id;
    char name[10];
    double db;
    char ch;
};
sizeof(struct st) = 28
是不是字符对齐的原因,是按什么规则对齐的?

论坛徽章:
0
发表于 2008-07-05 15:23 |显示全部楼层
IA32是4字节对齐的
struct st {
    int  id;
    char name[10];
    double db;
    char ch;
};
int id----------4
char name[10]-------10
-----------------2
double db---------8
char ch------------1
-----------------3
4+10+2+8+1+3=28

论坛徽章:
0
发表于 2008-07-05 15:33 |显示全部楼层
prolj 大哥,谢谢,受益了!

可是为什么打印出来的地址是这样的:
id      =7ffffa40
name=7ffffa44
db     =7ffffa50
ch     =7ffffa58

论坛徽章:
0
发表于 2008-07-05 15:41 |显示全部楼层

回复 #9 rock_jq 的帖子

id      =7ffffa40
name=7ffffa44
db     =7ffffa50
ch     =7ffffa58
按照你的结果是这样的
id = 7ffffa44 - 7ffffa40 = 4
name[] = 7ffffa50 - 7ffffa44 = 6
db = 7ffffa58 - 7ffffa50 = 8
剩下的ch应该占4个

不明白为什么这样
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP