C语言中结构体变量所占内存大小的计算

Posted ShitMaker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中结构体变量所占内存大小的计算相关的知识,希望对你有一定的参考价值。

“系统为结构体变量分配的内存空间的大小,并非是其所有成员所占内存大小之和,它不仅与所定义的结构体类型有关,还与计算机系统本身有关。

由于结构体变量成员的内存对齐方式和数据类型所占的内存大小都是与机器相关的,因此结构体在内存中所占的字节数也是与机器相关的。”

----------------------------------《C语言程序设计(苏小红)》

在计算结构体变量所占内存的字节数时,通常要依据两条原则来计算:

(1)前n个结构体成员所占内存的字节数之和等于第n+1个结构体成员所占字节数的整数倍,不足的在第n个结构体成员上按最小数补齐。

(2)结构体所有成员所占内存的字节数之和等于结构体成员中所占内存最大的的字节数的整数倍,不足的在最后一个结构体成员上按最小数补齐。

#include <stdio.h>

typedef struct data {
int year;
int month;
int day;
} DATE;

typedef struct student {
long studentID;//4
char studentName[10];//1*10
char studentSex;//1
DATE birthday;//3*4
int score[4];//4*4
} STUDENT;

int main() {
STUDENT stu1 = {.studentID = 100310121, .studentName = "王刚", .studentSex = \'M\', .birthday = {.year = 1991, .month = 5, .day = 19}, {72, 83, 90, 81}};
printf("bytes=%d\\n", sizeof(stu1));
return 0;
}

以64位体系结构和上述代码中的stu1结构体变量为例:

(1)正常所占内存大小

long studentID                ----------4字节

char studentName[10]   -----------10个1字节

char studentSex            -----------1字节

DATE birthday               -----------4个4字节

int score[4]                     -----------4个4字节

结构体stu1所占内存大小:43

计算过程

sizeof(1)%sizeof(2)=0

{sizeof(1)+sizeof(2)}%sizeof(2)=0

......

{sizeof(1)+sizeof(2)+......sizeof(12)}%sizeof(13)=3:第12个结构体成员需补1

......

{sizeof(1)+sizeof(2)+......sizeof(20)}%4=0

(2)补齐后所占内存大小

long studentID                ----------4字节

char studentName[10]   -----------10个1字节

char studentSex            -----------2字节

DATE birthday               -----------4个4字节

int score[4]                     -----------4个4字节

结构体stu1所占内存大小:44

以上是关于C语言中结构体变量所占内存大小的计算的主要内容,如果未能解决你的问题,请参考以下文章

C语言 如何计算结构体的大小

c语言中,系统为结构类型变量所分配的内存空间大小如何确定?

如何计算Java对象所占内存的大小

C语言中是否变量类型占几个字节,它的地址就占几个字节

结构体所占内存大小

结构体和联合体