char* BR_Buf = NULL;
uint16_t Config_Rlen = 1024;
BR_Buf = (char*)malloc(sizeof(char)*1024); //申请动态存储区,存储于“堆区”
if(BR_Buf == NULL)
{
printf("\r\n malloc BR_Buf failse\r\n");
return 0;
}
free(BR_Buf); //释放str内存
BR_Buf = NULL; //使str指针指向空地址,
本文主要介绍了两种c/c++获取malloc分配内存空间大小的方式,如下:
- 通过指针
- 通过调用函数
应用场景(arm_linux 开发板):
在项目开发过程中,被调函数主动分配的堆区内存如何获取其大小呢?
在不知道其内存大小的情况下使用起来感觉并不方便,而且容易引发内存问题。
通过指针查询内存大小
在使用malloc或new主动分配内存时,系统会所分配的内存空间首地址的前4个字节中存储着所分配的内存大小值。
假设内存的首地址为p,那么所分配的内存大小为*((int)p-4),此处的类型强制转换是由于可能p指向的内存不是int型而导致 p-4 并不是只减去4个字节的大小。
通过函数查询内存大小
调用malloc.h文件库中的malloc_usable_size()函数可直接获取所分配内存空间的大小,c++中则调用_msize()函数
示例
如下定义一结构体stu,并使用结构体指针pstu分配若干个(此处14个)sizeof(stu)的内存空间
typedef struct
{
char name[9];
}stu;
int main()
{
int cnt = 0;
stu *pstu = NULL;
int *p = NULL;
int stulen = sizeof(stu);
pstu = (stu *)malloc(sizeof(stu)*14);
p = (int)pstu-4; //将stu *类型强制转换为 int类型,获取pstu第前四个字节地址。
cnt = (*p-5)/stulen; //求取分配的stu类型的数目
printf(" addr: %d \n stulen:%d \n cnt:%d\n size:%d\n size():%d \r\n",p, stulen, cnt, *p-5, malloc_usable_size(pstu));
free(pstu); //需要主动释放内存
pstu = NULL; //防止出现野指针}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
注:上述通过指针得到内存大小总比函数查询的内存大5个字节。
结果打印
注:在malloc分配内存过程中有一定的规则
- 当所分配内存<=12byte 系统会默认分配12byte,即系统分配最小内存数。
- 当需要分配内存>12byte时,系统会以8byte为单位进行叠加。同时还需要注意的是不同系统的最小内存分配数和递增步长可能有所不同(可以通过增加stu的长度来测试)。
- 若要通过上述方法求取stu的数目至少有两个条件,1、sizeof(stu)>=8 ; 2、stu长度固定