为结构体成员分配内存的原则是:
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 <stdio.h>
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.