内存管理,分配,访问,动态申请方式研究(一)

本文探讨了在64位系统中,内存动态申请(如通过malloc)时,不同数据类型的指针如何以不同单位递增。例如,void *类型的指针按8字节递增,而short int类型则按2字节递增。对于结构体,如struct struct_pix,其内存管理取决于数据成员的排列。在处理unsigned long long时,可以将其转化为short int类型以按照2字节访问。内存管理的关键在于理解数据类型的大小和对齐规则,避免地址越界和段错误。
摘要由CSDN通过智能技术生成

int a

char a

先上一段代码:

void creat_map1()
{
	int i = 0,j = 0;
	short int * ptr =NULL;
	SX_U64 * ptr1 =NULL;
	long long  strlen = 0;
	strlen = 260 * 216 * sizeof(struct struct_pix); // 260 * 216 *6
	//ptr =(struct struct_pix *)malloc(strlen);
	ptr1 = (SX_U64 *)malloc(strlen);
	ptr =   (short int *)ptr1;
	printf("+++ 1        ptr  %x    ptr1  %x  +++\r\n",ptr,ptr1);
	int m = 0, n = 0, u = 0, v = 0;				
	for(i= 0;i < max_row;i++)
	{
		for(j= 0;j < max_col;j++)
		{
		printf(" ptr1 %x,ptr+0 %x, ptr +1 %x,ptr +2 %x\r\n",ptr1+i * max_col + j,ptr+i * max_col + j,ptr+i * max_col + j +1,ptr+i * max_col + j+2);
		}
	}
}

在这里插入图片描述
运行结果:64位的系统,申请的8位字节时,ptr + 1,都是以8个字节单位,访问,以0或8为结束,如果将申请的地址强制转换为
short int型,ptr+ 1时,是以2个字节为单位进行访问,管理的
malloc动态申请内存时,返回值是void * ,所以类型转换时,一定要注意,内存是怎么管理的。否则后面运行会发生段错误,地址越界等。

如果定义为,(struct struct_pix *)malloc(strlen)类型,我的结构体

#pragma pack(2)
struct struct_pix
{
    short int x;    
    short int y;  
    short int flag;    
};
#pragma pack()

则以6个字节进行管理
即ptr +1 是以6为单位相加

二;定义为char型或void时,申请到的地址则是1个单位递增的

{
	int i = 0,j = 0;
	void * ptr =NULL;
	long long  strlen = 0;
	strlen = 260 * 216 * sizeof(struct struct_pix); // 260 * 216 *6
	ptr = (void*)malloc(strlen);
	或ptr = malloc(strlen);
	printf("+++         ptr  %x      +++\r\n",ptr);
	int m = 0, n = 0, u = 0, v = 0;				
	for(i= 0;i < max_row;i++)
	{
		for(j= 0;j < max_col;j++)
		{
		printf(" ptr1 %x,ptr+0 %x, ptr +1 %x,ptr +2 %x\r\n",ptr1+i * max_col + j,ptr+i * max_col + j,ptr+i * max_col + j +1,ptr+i * max_col + j+2);
		if(ptr1 == NULL)
		{
			printf("++++++     malloc fail      +++++\r\n");
			continue;
		}							
		}
	}
}

结果:一个字节为单位,递增,物理内存实际是如下方式递增的,当申请不同类型时,管理方式不一一样,
在这里插入图片描述
三:如果定义如下一个结构体,动态申请为 unsigned long long 8位的地址,该如何存放呢?
#pragma pack(2)
struct struct_pix
{
short int x;
short int y;
short int flag;
};
如上面研究表明,地址递增都是8个字节为单位增加,数据类型将是8个字节的long long 型 如果想将上面定义的结构体的数据存放,可以类型转化为(short int)型,进行访问存放
(short int)0x1111 1118 = x
(short int)0x1111 1118 + 1= y
(short int)0x1111 1118 + 2 = flag
加1实际是以2个字节增加,地址将是0x1111 111c ,加2地址将是0x1111 111e,x将存在0x1111 1118和0x1111 1119的空间地址上,
y将存放在0x1111 111a和0x1111 111b上,flag将存放在0x1111 111c和0x1111 111d上,

在这里插入图片描述
实际物理空间的地址是以8位为一个字节增加的

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值