C语言结构体(struct) ----内存对齐

C语言结构体(struct) ----内存对齐

再没有#pragma pack宏定义的情况下基本如下:

  1. 该数据成员存放起始地址(“&”取地址符得到的地址)在该成员大小的整数倍上开始
    比如:一个结构体中存在一个int类型的数据成员,则该数据成员存在位置只能相对于该结构体实例化后的相对地址:0、4、8、12…的位置出现。
#include <iostream>
#include <string>
using namespace std;
struct student{
	int age;
}
struct teacher{
	char name;
	int age;
}
void main(){
student std;
std.age = 1;
teacher tch ;
tch.name = '1'; tch.age = 1;
printf("学生的位置为:%d\n",&std);
printf("学生中年龄的位置为:%d\n",&std.age);
printf("老师的位置为:%d\n",&tch);
printf("老师中年龄的位置为:%d\n",&tch.age);
//打印结果位:
学生的位置为:7339488
学生中年龄的位置为:7339488
老师的位置为:7339472
老师中年龄的位置为:7339476
}

2.如果结构体内部的数据成员也是一个结构体,这种情况下内部的结构体不会被看作一个整体,而是以内部结构体当中最大元素的大小作为判断依据,进行上一条规则进行:`

	#include <iostream>
	#include <string>
	using namespace std;
 ```struct teacher{
	int name;
	char age; 
};
struct student{
	char age;
	teacher teacher;
	int name;
	
	char age2;
	char age3;
	char age4;
	char age5;
	
};
void function(){
	student std ;
	std.age = '1';std.age2 = '1';std.age3 = '1';std.age4 = '1';std.age5 = '1';std.name = 1;std.teacher.name = 1; std.teacher.age = '1';
	printf("总地址为:  %d\n" , &std);
	printf("1号地址为:  %d\n" , &std.age);
	printf("teacher号地址为:  %d\n" , &std.teacher);
	printf("teacher的名字号地址为:  %d\n" , &std.teacher.name);
	printf("teacher的年纪地址为:  %d\n" , &std.teacher.age);
	printf("name号地址为:  %d\n" , &std.name);
	printf("2号地址为:  %d\n" , &std.age2);
	printf("3号地址为:  %d\n" , &std.age3);
	printf("4号地址为:  %d\n" , &std.age4);
	printf("5号地址为:  %d\n" , &std.age5);
	//画内存
	for(int i = 0 ; i < sizeof(student) ; i ++){
		printf("*\n");
	} 
}
//打印结果如下:
总地址为:  7339472
1号地址为:  7339472
teacher号地址为:  7339476
teacher的名字号地址为:  7339476
teacher的年纪地址为:  7339480
name号地址为:  7339484
2号地址为:  7339488
3号地址为:  7339489
4号地址为:  7339490
5号地址为:  7339491
内存占用画出来就是如下这个样子(空心表示空闲):
■ □ □ □ ■ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
细心地小伙伴可以能会发现:
首地址 - ( 最后一个成员首地址 + 该成员大小 ) = 19
我画小方格画了 20 个 ,这就是下面说的最后一个规则啦 ~~
  1. 结构体的总大小:也就是sizeof的结果:整体大小是内部最大成员大小的整数倍
    对于我们上面的测试而言,其中最大成员为int(4byte),所以最后结构体大小就从19扩展到20啦。
#include <iostream>
	#include <string>
	using namespace std;
 ```struct teacher{
	int name;
	char age; 
};
struct student{
	char age;
	teacher teacher;
	int name;
	
	char age2;
	char age3;
	char age4;
	char age5;
	
};
void function(){
	cout<<sizeof(student)<<endl;
}
//
输出的结果为:20
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值