结构体所占内存大小

结构体所占内存大小划分原则:

1、划分字节,按照当前结构体中,字节数最大的类型作为划分单元。【这里面还有一些前提。下面的例子会详细说到】

2、以矩形块儿的形式划分。

#include <stdio.h>

/**划分示意图:

最小单元是 double所以 这个 地方按照8个字节作为最小单元来划分。

*/

struct student1

{

double avgMark;

int ID;

};

/**划分示意图:

最小单元不能是数组这个地方的最小单元是 1个字节

*/

struct student2{

char name[5];

char id[2];

};

/**划分示意图:

数组不作为划分单元,所以最小划分单位是int 4个字节。

*/

struct student3{

int ID;

char name[10];

};

/**划分示意图:

30个格格就不画了。但是可以很明显的知道,划分单元是4个字节。这样name部分会浪费两个字节,所以它的占地面积是36个字节。

*/

struct BaseInfo{

char name[30];

int age;

};

/**划分示意图:

这个 划分就格外有说法了,划分单元到底取4还是取36.C语言作为一门经久不衰的语言,想想也不可能是36,要是BaseInfo里面写一个char name[100],那一个student4就会浪费100个字节。这太可怕了。这就是它把每一个结构体都要细分的原因,方便这个结构体融入到别的别的结构体中。

*/

struct student4{

int ID;

struct BaseInfo baseInfo;

};

/**划分示意图:

也不画了,char a会浪费3个字节,char c会浪费3个字节,一共占地面积是12个字节。

*/

struct test1{

char a;

int b;

char c;

};

/**划分示意图:

a和c共享一行,然后浪费两个字节,

Int单独占一行,所以总共的占地面积是8个字节。

*/

struct test2{

char a;

char c;

int b;

};

int main(){

printf("sizeof(struct student1) = %d\n", sizeof(struct student1));//这个案例在开始看视频的时候,就想写了,毕竟double占8个字节。16

printf("sizeof(struct student2) = %d\n", sizeof(struct student2));//7

printf("sizeof(struct student3) = %d\n", sizeof(struct student3));//16

printf("sizeof(struct student5) = %d\n", sizeof(struct student4));//40

printf("sizeof(struct test1) = %d\n", sizeof(struct test1));//12

printf("sizeof(struct test2) = %d\n", sizeof(struct test2));//8

getchar();

return 0;

}

后面这部分是想着想着觉得不对劲,补进来的:

struct test3{

double a;

};

struct test4{

struct test3 t3;

char a;

};

试试test4的占地面积吧~~~还蛮好玩的。

附运行结果:

时间: 2024-10-25 07:56:12

结构体所占内存大小的相关文章

C语言结构体所占内存大小

用一道面试题题引入struct str1    {         char   a;         int    b;         float  c;     double d;  };char类型占用1个字节,int型占用4个字节,short类型占用2个字节,float占4字节,double占8字节:那么我们可能会犯一个错误就是直接1+4+2=7,认为该结构体占用7个字节.这是错的.百度一了下发现这是因为计算机中存在一种叫做内存对齐的机制导致了该结果的发生. 在计算机中通常会让CPU从

结构体所占字节大小计算以及共用体大小计算

#include<stdio.h> struct student{ int num; char sex; float score; } ; union data{ int k; char ch; float f; }; int main(void){ printf("%d\n",sizeof(struct student)); printf("%d",sizeof(union data)); } 详细计算见:https://blog.csdn.net/u

结构体所占存储空间

原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的.从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算). 原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束:若不是,则补齐为它的整数倍.最后的元素也要按照最大元素字节数补齐. 原则三:如果是含有结构体的结构体,则是结构体里结构体成员的方式对齐,不是按照

结构体声明与内存对齐

1.结构体的声明: 1)struct Student{ int stu_id; char name[25] int age; char sex;  }; Student student1, student2; 2)struct Student{ int stu_id; char name[25] int age; char sex;  }student1,student2; 3)struct { int stu_id; char name[25] int age; char sex;  }stu

【C语言】结构体中的内存对齐问题

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨. 结构体内存对齐有三个原则; 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s

浅谈结构体如何分配内存

今天把操作符sizeof用了个遍,各种类型基本都用了,最后发现结构体类型最麻烦.下面直接进入主题: (1)先是定义了如下结构体: struct{            char a;            int i;            double d;            }text; 然后用sizeof(text),预期结果是1+2+8 = 11???如果这样想就错了,答案是16. (2)然后,换一下变量的顺序: struct{            char a; double d

C++类所占内存大小计算

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:[email protected] 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所

结构体,共用体,枚举所占内存大小

结构体要注意位补齐(有4位补齐和8位补齐,默认8位) 1 #include<stdio.h> 2 #pragma pack(push) 3 #pragma pack(4) 4 struct test 5 { 6 7 char a; //补3位 8 long c; 9 char d; 10 char h;//补2位 11 int b; 12 char e; //补3位或补7位 13 double f; 14 char g; //补3位或补7位 15 }s1; 16 #pragma pack(po

结构体变量的内存结构

在C语言中,在默认情况下,编译器规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节的倍数. 例如: struct MyStruct { double ddal: char dda: int type: }: 得到的结果为:16 所以,在计算结构体变量的大小时: ①上面的所有字节数的总和,必须是下一个类型的整数倍数. ②总字节数一定是最大类型的整数倍. 例题: char a: double b: int e: 得:20