结构体变量内存分配问题

遵守两个原则

1.为结构体变量的成员变量分配内存的起始地址必须为成员变量内存长度的整数倍。
2.结构体变量内存的总大小必须为sizeof(结构体成员变量)(最大的)的整数倍。

struct Demo{
	char a;//sizeof(char)=1
	int b;//sizeof(int)=4
	flloat c;//sizeof(float)=4
	double d;//sizeof(double)=8
};
struct Demo demo;
sizeof(demo)=24;
  1. 假设从0开始为结构体变量分配内存
  2. 0:分配给demo.a;
  3. 4-7:分配给demo.b,根据原则一,分配起始地址必须为成员变量内存长度的整数倍,1不是4的整数倍,所以从4开始分配;
  4. 8-11:分配给demo.c;
  5. 16-23:分配给deom.d,根据原则一分配起始地址必须为成员变量内存长度的整数倍,必须为8的整数倍,12不是8的整数倍,必须从16开始,同时满足原则二,成员变量占内存最长为8,24为8的整数倍,所以该结构体分配内存24;
struct Demo{
	char a[6];//sizeof(char)=1
	double b;//sizeof(double)=8
	int c;//sizeof(int)=4
};
struct Demo demo;
sizeof(demo)=24
  1. 假设从0开始为结构体变量分配内存
  2. 0-5:分配给demo.a;
  3. 8-15:分配给demo.b(根据原则一);
  4. 16-19:分配给demo.c(根据原则一);
  5. 20-23:补全为8的倍数(根据原则二)。
struct Demo{
	char a[6];
}demo;
sizeof(demo)=6;
struct Demo{
	char a[6];
	struct Demo *next;
}demo;
sizeof(demo)=16;(64位计算机)

指针变量的功能是存储变量的地址,所以在定义执政变量的时候会为指针变量分配一定的内存(16位:2,,32位:4,64位:8),而且这个内存的大小与指向的变量的类型无关,并不是指向double类型就分配8,指向int类型为4,而是即使指向的char类型,分配的也是8(64位),因为指针变量里面存储的只是地址

大家把上面几个例子分析清楚,应该对结构体内存分配了解的就差不多了,如有错误希望大家指正。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值