c语言结构类型变量所占有的内存空间问题,按照所有类型的内存空间相加,下面的应该是13,113吧,还有一个难以计算?

#include <stdio.h>
struct SIMPLE
{
    int a;
    char b;
    double c;
} simple;
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
    char string[100];
    struct SIMPLE a;
} complex;
/此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
}node;
int main()
{

 printf( "Memory size occupied by a: %d\n", sizeof(a));
 printf( "Memory size occupied by complex: %d\n", sizeof(a));
printf( "Memory size occupied by node: %d\n", sizeof(node));

}

为什么结果显示a是16,complex是120,node是112?

struct SIMPLE里面类型的大小是,4,1,8,对其大小为8(一般为最大的),结构体大小为最大的倍数。按顺序放4,1放一个8字节,8单独一个8字节。
struct COMPLEX里面类型的大小是,100个1,4,1,8,对其大小为8(一般为最大的),结构体大小为最大的倍数。按顺序放前96个1,放到12个8里面,接下来两个1和一个四放到一个8里,接下来的1,放到一个8里,最后一个8放到一个8里。15个,120。关于第二个8,因为它们还要遵守,放到位置的相对地址是自己大小的整倍数处,所以那个4只能放到他那个8的后半部分,而不能紧挨着那两个1放。同理,最后一个8单独占一个8。

同理,最后一个,你应该实在x64位系统下运行的,所以是那个指针大小是8(x86是4),最大所以是,96(96*1),8(4*1),8(8) = 112;x86下是104

了解一下结构体内存对齐。

结构体对齐规则了解下,供参考:https://wenku.baidu.com/link?url=qjtTVfhnKCQh0P5BKKfHu4xQtE-MQ5pXpdg8uCdNOO8dzWoH0f7pIMKIWaYVwxKzBpKm6_nWpW6b-TmmxMaK8EkWmGegEKMsMRVXHNdFfdLkfpH67uAMXM2BlvOfSu13

结构体变量的的存储空间是按照成员中占用内存最大的的类型来作为基本存储单元,某个成员如果遇到该单元空间不足,则宁肯不使用用剩余的空间,也要存储到下一个单元;分配空间时需按照成员变量的声明顺序来一个变量一个变量的往下分配;若某成员是结构体,则把它还原成原本顺序下的基本数据类型之后再决定基本单元的内存大小;指针变量所占用的内存大小是8字节(x64)、4字节(x86);
a占用内存大小(32位机):4byte(int)+1byte(char)+3byte(剩余空间)+8byte(double) = 16byte;存储单元是8byte,结构体变量的存储空间是16bytes;
b占用的内存大小:100个char(1byte),一个int(4byte)一个char(1byte)一个double(8byte),那么8byte是基本单元的大小,b的内存空间构成:128(96个char 12个存储单元 )+4byte( 4个char)+4byte(一个int)+1byte(一个char)+7byte(空闲空间)+8byte(double)= 158 =120byte;结构体成员a必须还原成一个int(4byte)一个char(1byte)一个double(8byte)之后再分析;
node的内存大小:100个char(1byte),一个指针类型(x64系统下是8byte,x86下是4byte)
128byte(96个char)+4byte(4char)+4(空闲空间)+8byte(double);148=112;