免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7958 | 回复: 11
打印 上一主题 下一主题

[C] 这个结构体到底占几个字节? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-21 18:00 |只看该作者 |倒序浏览
/*4+5=12????  vc++6.0下运行*/

#include "stdio.h"

void main()
{
   
    struct list
    {
              int a;
              char b[5];       
    }s[3];
    char c[5];
    printf("%d\t\t\t%d\t\t\t%d",sizeof(int),sizeof(c),sizeof(struct list));
}

论坛徽章:
0
2 [报告]
发表于 2008-06-21 18:05 |只看该作者
32位对齐,也就是4个字节
    struct list
    {
              int a;             /////4个字节
              char b[5];     /////占8字节
    }s[3];

论坛徽章:
0
3 [报告]
发表于 2008-06-21 18:08 |只看该作者

回复 #2 aoegiss 的帖子

char b[5];     /////占8字节
前面四个每个占1个字节,剩下的那一个再占4个字节?

论坛徽章:
0
4 [报告]
发表于 2008-06-21 18:11 |只看该作者

回复 #3 0vercome 的帖子

查不多,但是不能这么说, 应该说空着三个

论坛徽章:
0
5 [报告]
发表于 2008-06-21 18:11 |只看该作者

回复 #4 aoegiss 的帖子

哦了,明白~!!谢了!

论坛徽章:
0
6 [报告]
发表于 2008-06-21 18:12 |只看该作者

回复 #5 0vercome 的帖子

不客气

论坛徽章:
0
7 [报告]
发表于 2008-06-22 03:40 |只看该作者
这是我以前遇到这样的问题是汇集的笔记,可能对你有些帮助,

sizeof 结构体
    编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型
(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此
类推.这样,两个数中间就可能需要加入填充字节,所以结构体的sizeof值就不是简单的成员的sizeof相加了.
   
   字节对齐的细节和编译器实现相关,一般满足以下三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成
   员之间加上填充字节(internal adding);
3) 记住:结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上
   填充字节(trailing padding).

论坛徽章:
0
8 [报告]
发表于 2008-06-22 03:41 |只看该作者
太长 分开继续~~~

说明:
(1)这里所说的“数据宽度”就是指其sizeof的大小.由于结构体的成员可以是复合类型,比如另外一个结构
   体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体.
   但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待.
(2)有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令.它是用来调整结构体对齐方式的,
   不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关.
   #pragma pack的基本用法为: #pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,
   如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准.
(3)“空结构体”(不含数据成员)的大小不为0,而是1.

论坛徽章:
0
9 [报告]
发表于 2008-06-22 15:29 |只看该作者
LZ 你研究这个真的没什么意义。真的

论坛徽章:
0
10 [报告]
发表于 2008-06-22 16:44 |只看该作者
windows上vc有个选项可以设置结构体的填充位,我想gcc也该有,但不知道是什么选项。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP