小问题:看看这个结构体的大小?

scalps 2003-09-30 10:00:35

请看一个很简单的程序:

#include <stdio.h>
struct cic{
char a;
int b;
char c;
};

int main()
{
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(struct cic)); // ???

return 0;
}

问 struct cic 的大小是多少(好好想一想哦)?? 为什么?


...全文
81 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-10-01
  • 打赏
  • 举报
回复
这些东西不要去猜它,不同的编译器,不同的系统都不一样,等64位操作系统成为主流,大家现在正确的猜测可能又不正确了。
sizeof说是多少就是多少。
使用结构体,尽量直接使用其字段,而不要对其内部存储结构做某种猜测性假设。
Wolf0403 2003-10-01
  • 打赏
  • 举报
回复
总之呢,
struct cic{
char a;
char c;
int b;
};
是个铁定保险的写法,8 bytes ,呵呵。
======================================
另外,楼上各位说 8 bits 的兄弟是错的。一个 bool 就是 8 bits 了。一个 int 是 32bits。
robbie24 2003-10-01
  • 打赏
  • 举报
回复
都说过了~
总之不是所有data member长度的总和.在这方面一直存在误导
deathsky 2003-10-01
  • 打赏
  • 举报
回复
恩,学习!
C723 2003-10-01
  • 打赏
  • 举报
回复
一般把同类型的写在一起节省空间
struct cic
{
char a;
char c;
int b;
};

robertnet 2003-10-01
  • 打赏
  • 举报
回复
8bit 参考Inside The C++ Object Model
m0772 2003-10-01
  • 打赏
  • 举报
回复
d
njypch 2003-09-30
  • 打赏
  • 举报
回复
这和工程的对齐方式设置有关.很容易理解,
如果是1字节对齐,sizeof(cic)=6;
如果是2字节对齐,sizeof(cic)=8;
如果是4字节对齐,sizeof(cic)=12;
如果是8字节对齐,sizeof(cic)=12;
如果是16字节对齐,sizeof(cic)=12.
njypch 2003-09-30
  • 打赏
  • 举报
回复
这和工程的对齐方式设置有关.很容易理解,
如果是1字节对齐,sizeof(cic)=6;
如果是2字节对齐,sizeof(cic)=8;
如果是4字节对齐,sizeof(cic)=12;
如果是8字节对齐,sizeof(cic)=24.

daizh 2003-09-30
  • 打赏
  • 举报
回复
这个问题msdn有很详细的解释,对于结构体它的sizeof()与pack alignment有关。
Jinhao 2003-09-30
  • 打赏
  • 举报
回复
聪明的编译器会弄成这样
struct cic{
char a;
char c; //这个和上面的类型相同,所以它们占用了2个字节,不足4个,补齐4成字节
int b;
}; 结果就是8

尊重开发者的编译器,就弄成这样
struct cic{
char a; //一个字节,不足4个,补齐4个
int b;
char c; //一个字节,不足4个,补齐4个
}; 结果就是12
Jinhao 2003-09-30
  • 打赏
  • 举报
回复
聪明的编译器会弄成这样
struct cic{
char a;
char c; //这个和上面的类型相同,所以它们占用了2个字节,不足4个,补齐4成字节
int b;
}; 结果就是8

尊重开发者的编译器,就弄成这样
struct cic{
char a; //一个字节,不足4个,补齐4个
int b;
char c; //一个字节,不足4个,补齐4个
}; 结果就是12
TheVCBeginner 2003-09-30
  • 打赏
  • 举报
回复
如果是在VC下,sizeof 的长度为4,这个与编译器有关,也可能对操作系统有关。
gracian 2003-09-30
  • 打赏
  • 举报
回复
12
wgzh(火鸟) 说的有点道理:)
19830711 2003-09-30
  • 打赏
  • 举报
回复
6
flowerlee 2003-09-30
  • 打赏
  • 举报
回复
12
要什么为什么?
wgzh 2003-09-30
  • 打赏
  • 举报
回复
这跟编译器实现有关,理论上应该是6,但实际可能有12,或者是8,有些编译器要做些内存对齐之类的优化处理!
RainWindy 2003-09-30
  • 打赏
  • 举报
回复
一般情况下是6,这是在编译器下设置对齐方式为1,编译器不会随便调整前后顺序的。因为开发员定义顺序时有他自己的道理,如果调整了,反面是不尊重程序员。
antijpn 2003-09-30
  • 打赏
  • 举报
回复
首先要看编译器是对每一种变量的长度的定义是多少,然后就是字节对齐。
有的编译器可以强制关闭字节对齐,不过不推荐为了节省内存而关闭字节对齐,这样可能在Alpha的处理器上造成异常(Intel系列的处理器会自动进行修正,参见以前的讨论)。

保存一个变量的地址必须能被这个变量的长度整除,所以一个数据的长度是8Byte,那么保存这个数据的地址必须能被8整除。所以不考虑编译器对代码的优化,结果就是12,如果有优化,那么至少是8,这样的结果是基于32bit系统的
yonyon 2003-09-30
  • 打赏
  • 举报
回复
Jinhao(辣子鸡丁)
加载更多回复(2)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧