| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 590 人关注过本帖, 1 人收藏
标题:求sizeof()的问题
只看楼主 加入收藏
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:10 
求sizeof()的问题
程序代码:
#include<stdio.h>
int main()
{
    struct Data{
        int year;
        int month;
        int day;
    };
    struct stu{
        char stunum[10];
        struct Data stubirthday;
        float h;
        float w;
    }one;
   
    printf("%d\t",sizeof(one));
}


#include<stdio.h>
int main()
{
    struct stu{
                char s[15];
                float score[4];
            }team;
    printf("%d\n",sizeof(team));
}


#include<stdio.h>
int main()
{
    struct str{
        float a,b;
        char c[6];
    };

    printf("%d\n",sizeof(struct str));
}
第一个为什么是24,而不是10+12=22,。
第二个为什么是32,而不是15+16=31;
第三个为什么是16,而不是8+6=14;
这个sizeof()究竟是怎么占用内存的?求解啊!
2011-07-14 22:32
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:8 
1:
10+2*3+4+4=24;因为在16位的编译器如TC下,int为2字节,float为4字节,正好对齐,故总计24;
但在VC下sizeof(int)=4,sizeof(float)=4,考虑到结构体内存对齐,总计为(10+2)+4*3+4+4=32

2:结构体内存对齐

3:结构体内存对齐

[ 本帖最后由 ppfly 于 2011-7-14 23:05 编辑 ]

********多贴代码,少说空话*******
2011-07-14 23:02
asun1388
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2011-4-15
收藏
得分:0 
额,第一个应该是24,是10+6(2+2+2)+8(4+4);//前面2是int字节数,后面4是float字节数
第二个应该是本来char大小为15,float大小为16,为了照顾数据对齐所以sizeof(team)是32
第三个float大小为8,char大小为6,为了照顾数据对齐所以sizeof(struct str)shi 16;
2011-07-14 23:20
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 2楼 ppfly
请问什么是结构体内存对齐?请指教。。。
2011-07-15 00:27
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 楼主 笨女孩
谢谢,学习了~
2011-07-15 08:01
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:2 
回复 3楼 asun1388
http://www.
上面有《sizeof(结构体)和内存对齐 》
2011-07-15 08:07
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
https://bbs.bccn.net/thread-344137-1-1.html
《一个关于struct字节对齐的问题》
2011-07-15 08:16
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
2011-07-15 09:09
z843137202
Rank: 1
等 级:新手上路
帖 子:19
专家分:9
注 册:2011-6-12
收藏
得分:0 
打酱油的
2011-07-15 10:28
gu_tong2008
Rank: 1
等 级:新手上路
帖 子:250
专家分:7
注 册:2009-9-18
收藏
得分:0 
以下是引用ppfly在2011-7-14 23:02:24的发言:

1:
10+2*3+4+4=24;因为在16位的编译器如TC下,int为2字节,float为4字节,正好对齐,故总计24;
但在VC下sizeof(int)=4,sizeof(float)=4,考虑到结构体内存对齐,总计为(10+2)+4*3+4+4=32

2:结构体内存对齐

3:结构体内存对齐
我学的int是4个字节的了!呵呵,
2011-07-15 11:21
快速回复:求sizeof()的问题
数据加载中...
 
   



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

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