linux 指针参数所指向空间大小的计算 malloc realloc alloc 指针指向空间的大小的计算 malloc_chunk结构
来源:互联网 发布:新加坡网上购物软件 编辑:程序博客网 时间:2024/05/05 20:20
原理:
glibc中的内存动态分配时通过一个结构来实现的
struct malloc_chunk
{
INTERNAL_SIZE_T prev_size; /* 如果前一个结构未使用则把这个填充为前一结构的size*/
INTERNAL_SIZE_T size; /* 本结构的size,最小16(本结构的大小),因为是8字节对齐,最后的三位用来做标记位 PREV_INUSE(最后一位用来标记前一结构是否使用) IS_MMAPPED 用来标记此内存块是不是由mmap()分配在free中会用到*/
struct malloc_chunk* fd; /* 如果本结构未使用则由fd bk双向链表来填充,如果使用则是malloc/alloc/realloc的返回首地址 */
struct malloc_chunk* bk;
};
#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐
void getPSize(void * p)
{
int size = chunksize(p);
printf("malloc size is %d",size - 8);
}
//下面这种方法也是可以的
#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))
typedef unsigned int INTERNAL_SIZE_T;
#define SIZEOF2INTERNAL_SIZE_T 2*sizeof(INTERNAL_SIZE_T)
struct malloc_chunk
{
INTERNAL_SIZE_T prev_size; /* 如果前一个结构未使用则把这个填充为前一结构的size*/
INTERNAL_SIZE_T size; /* 本结构的size,最小16(本结构的大小),因为是8字节对齐,最后的三位用来做标记位 PREV_INUSE(最后一位用来标记前一结构是否使用) IS_MMAPPED 用来标记此内存块是不是由mmap()分配在free中会用到*/
struct malloc_chunk* fd; /* 如果本结构未使用则由fd bk双向链表来填充,如果使用则是malloc/alloc/realloc的返回首地址 */
struct malloc_chunk* bk;
};
#define ChunkSize(p) ((struct malloc_chunk *)(p-SIZEOF2INTERNAL_SIZE_T))->size & ~(SIZE_BITS)
void getPSize(void * p)
{
//int size = chunksize(p);
int size = ChunkSize(p);
printf("malloc size is %d",size - 8);
}
int main()
{
unsigned char * p = malloc(0x50);
int size = chunksize(p);
char mm[100];
char * mmp = mm;
getPSize(p);free(p);
return 0;
}
- linux 指针参数所指向空间大小的计算 malloc realloc alloc 指针指向空间的大小的计算 malloc_chunk结构
- 结构体空间的大小计算
- 指针的类型 指针所指向 指向指针的引用
- 获取指针指向空间大小
- 计算指针指向的字符串的长度并提取计算字符串中数字的大小
- 指针所占用的空间大小
- 计算Oracle表空间的大小 利用率
- sizeOf计算空间大小的总结
- 获取数组和指针指向空间大小
- 指针组合(如指针数组)的区分及其结构体内存大小的计算
- 结构体的大小的计算与空间的优化--之基本类型
- 结构体的大小的计算与空间的优化--之位域字段
- 指针数组(指向指针的指针)空间的释放
- oracle计算表要使用的空间的大小
- C++的查看指针指向空间的所在的区域(是堆还是栈或者静态)和大小
- 获取指针指向区域的大小
- 用指向函数的指针比较大小
- 计算结构体的大小
- C# 中的位运算
- SQL里类似SPLIT的分割字符串函数
- 实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除 (转)
- c语言中命令行参数argc,argv
- 嵌套类
- linux 指针参数所指向空间大小的计算 malloc realloc alloc 指针指向空间的大小的计算 malloc_chunk结构
- 制作 MDI窗体
- 就计算机学习问题与一名高二学生的邮件往来
- sun的java的结果
- FSO 相关的代码
- 水晶按钮的实现
- SVG And Expat
- 辞职报告
- 8月份请关注我的新书《ASP.NET 2.0 网站开发技术详解》