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位为一个字节增加的