linux 指针参数所指向空间大小的计算

作者:kathy864  来源:IT165网络收集  发布日期:2011-07-20 19:31:28

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",the face shopsize - 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;
}你能够把这些讹谬增加到你的代码审查的察看列表(checklist)中,

 

转自:word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">word-wrap: break-word; white-space: normal; word-break: break-all">绮丝的博客

Tag标签: linux   指针   参数   空间  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规