【C语言】结构体内存大小的计算

为结构体成员分配内存的原则是:
1.以结构体名为偏移量为0的位置开始,对应的数据类型,需要在对应数据类型大小的整数倍偏移位置开始分配内存。比方说int类型数据,占4字节,那么分配内存的时候应当是在第一个4字节处分配,第二个4字节处分配,,,char类型可以在第一个1字节、第二个1字节。。。如果按照结构体成员次序不符合以上原则的话,就在其间填充字节,内容为随机数。
2.在为所有成员变量分配好内存后,还需要整体考虑其大小,要求分配后的内存大小为最宽成员变量的整数倍(满足要求的最小整数倍)。例如成员变量有 long 、short int 、char,三个数据类型,则要求结构体大小是long的整数倍字节数。

例1(64位系统为例).

typedef struct st1
{
	char a;//1字节
	long b;//4字节
	int c;//4字节
	double d;//8字节
	int* e;//8字节
}struct1;

开始分配内存:
1.char a 类型大小为1字节 ,按照顺序在偏移0处,满足在第一个1字节开始分配原则,结构体字节数+1
2.long b 类型大小为4字节,按照顺序是在偏移1处,不满足原则1,a,b之间填充3个字节,在第二个4字节处开始分配b。结构体字节数+3+4
3.int c 类型大小为4字节,按顺序刚好在第3个4字节处分配,满足原则1,字节数+4
4.double d 类型大小为8字节,按顺序不能满足原则1,填充4字节至第3个8字节处开始分配d 的内存。字节数+4+8
5.int *e 指针类型大小为8字节,按顺序刚好满足原则1,不必填充直接分配e内存字节数+8

经过上述1~5步骤字节数总共为1+3+4+4+4+8+8=32字节,是最宽类型8字节的整数倍,因而不需要填充。 sizeof(struct1) 值为32

代码:

#include 

typedef struct st1
{
	char a;//1字节
	long b;//4字节
	int c;//4字节
	double d;//8字节
	int* e;//8字节
}struct1;


int main()
{
    printf("a:%d\n",sizeof(char));
    printf("b:%d\n",sizeof(long));
    printf("c:%d\n",sizeof(int));
    printf("d:%d\n",sizeof(double));
    printf("e:%d\n",sizeof(int*));
    printf("struct1:%d\n",sizeof(struct1));

}

结果如下:

a:1
b:4
c:4
d:8
e:8
struct1:32

Process returned 0 (0x0) execution time : 0.636 s
Press any key to continue.

你可能感兴趣的:(c语言)