C语言结构体在内存中的分配
#include<stdio.h>#include<stdbool.h>#include<ctype.h>structtest2{charc1;charc2;shorts...
#include <stdio.h>#include <stdbool.h>#include <ctype.h>struct test2{ char c1; char c2; short s; int i;
};struct test1{ char c1; short s; char c2; int i;
};int main()
{printf("test1的字节数=%p\n",sizeof(struct test1));printf("test2的字节数=%p\n",sizeof(struct test2));}
为什么这两个结构体占用的存储不一样,一个12BYTE,一个8 byte。
结构体不是以最大的数据类型分配空间么? 展开
};struct test1{ char c1; short s; char c2; int i;
};int main()
{printf("test1的字节数=%p\n",sizeof(struct test1));printf("test2的字节数=%p\n",sizeof(struct test2));}
为什么这两个结构体占用的存储不一样,一个12BYTE,一个8 byte。
结构体不是以最大的数据类型分配空间么? 展开
1个回答
展开全部
因为内存对齐。
为了CPU更快地寻址,编译器会进行内存对齐。
char c1; //分配1字节空间
char c2; //分配1字节空间
short s; //上面的两个char占用空间刚好等于一个short,不会发生对齐,分配2字节空间
int i; //上面的两个char一个short占用空间刚好等于一个int,不会发生对齐,分配4字节空间
因此最后结构体test2的size为8字节
char c1; //分配1字节空间
short s; //地址未对齐,会发生内存对齐,补齐1字节的空间,然后再为short分配2字节空间
char c2; //分配1字节空间
int i; //地址未对齐,会发生内存对齐,补齐3字节的空间,然后再为int分配4字节空间
因此最后结构体test1的size为1+1(补齐)+2+1+3(补齐)+4=12字节
欲知详情,请百度“内存对齐”,这里不再详述。
为了CPU更快地寻址,编译器会进行内存对齐。
char c1; //分配1字节空间
char c2; //分配1字节空间
short s; //上面的两个char占用空间刚好等于一个short,不会发生对齐,分配2字节空间
int i; //上面的两个char一个short占用空间刚好等于一个int,不会发生对齐,分配4字节空间
因此最后结构体test2的size为8字节
char c1; //分配1字节空间
short s; //地址未对齐,会发生内存对齐,补齐1字节的空间,然后再为short分配2字节空间
char c2; //分配1字节空间
int i; //地址未对齐,会发生内存对齐,补齐3字节的空间,然后再为int分配4字节空间
因此最后结构体test1的size为1+1(补齐)+2+1+3(补齐)+4=12字节
欲知详情,请百度“内存对齐”,这里不再详述。
追问
如果单独定义这四个变量,不是放在结构体里的话,那么是按照你说的对齐原则。
因为我有看到有这种说法,说是结构体里按照占用字节最大的数据类型来“对齐”的,比如int 4,char是1,short 是2,那么全部分配4 字节。那么结构体都是16字节。
有这样的编译器这么分配内存空间么?
谢谢
追答
没有,内存对齐遵循的是“该变量的起始地址应该正好能被它自身占用的字节数整除”的原则,因此不可能这样分配内存,这样太浪费空间了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询