struct stOne // 结构体1
{
char c1;
int i1;
char c2;
int i2;
};
struct stTwo // 结构体2
{
char c1;
char c2;
int i1;
int i2;
};
各位大侠,上面两个结构体因为硬件的边界调整原则,占用内存大小并不相同。在我的电脑上,sizeof(struct stOne)是16,sizeof(struct stTwo)是12。
小弟有一疑问,会不会存在一种情况:
struct stOne stA, stB; // 定义两个结构体
这两个结构体大小并不相同,即同一类型结构体能否占用不同内存大小?
C语言中结构体占用内存大小的问题
答案:4 悬赏:40 手机版
解决时间 2021-01-30 23:06
- 提问者网友:最美的风景
- 2021-01-30 04:57
最佳答案
- 五星知识达人网友:神也偏爱
- 2021-01-30 05:56
不会,同一个结构体占用的内存都是一样的,
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
全部回答
- 1楼网友:污到你湿
- 2021-01-30 08:59
这是因为字节对齐原则,在Linux下其是按2字节对齐,可是在VC++下默认是按8字节对齐,必须满足4的整数倍。这样有助于存储效率。第一个char 为1字节,int为4字节,由于8字节对齐原则系统会预留出3个字节,保证8个字节对齐。而第二个两个char 2个字节,1个int4字节,系统补充2个字节后,此时8个字节,再加一个Int为12.满足条件
- 2楼网友:煞尾
- 2021-01-30 07:56
不会有问题的,把头文件包含进来就可以了,两个结构体互相引用时,如果不是指针才会出错,如果两个结构体有互相引用,就要先把一个typedef为空结构,这样编译才不会出错,编译过了就没问题了,有问题可以联系444376843,注明是“提问c”
- 3楼网友:空山清雨
- 2021-01-30 06:36
你好,struct stOne stA, stB; // 定义两个结构体
这两个结构体大小完全相同!!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯