我在C中实现自己的内存池,我遇到的问题是找出* ptr指向的内存块有多少字节(size_t poolSize(void * ptr))。代码只是为了展示我所拥有的部分以及问题所在,我知道我必须处理对齐和其他一些事情。我也是C的新手,我自学,所以我还在学习指针是如何工作的(我的问题可能是指针)。
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE MemPool;
struct NODE
{
char * next;
char * end;
};
MemPool * poolCreate( size_t size )
{
MemPool * newPool = (MemPool *)malloc( size + sizeof(MemPool) );
newPool->next = (char*)&newPool[1];
newPool->end = newPool->next + size;
return newPool;
}
void * poolAlloc( MemPool *pool, size_t size )
{
void *result = NULL;
if( (pool->end - pool->next) < size )
return NULL;
result = (void *)pool->next;
pool->next += size;
return result;
}
size_t poolSize(void *ptr)
{
return ((size_t)&ptr);
}
void poolDestroy( MemPool *pool )
{
free(pool);
}
答案 0 :(得分:1)
* ptr
指向的内存块有多少字节
不,您没有标准方法从指针本身查找已分配内存的大小。在进行malloc
时,您必须自己跟踪大小。或者您必须将分配的内存大小存储在另一个变量中。
答案 1 :(得分:0)
不确定代码究竟要做什么,但结果如下:
1。
MemPool * newPool = (MemPool *)malloc( size + sizeof(MemPool) );
分配内存:
[[ sizeof(MemPool) ][ size ]]
^
|
newPool
2
newPool->next = (char*)&newPool[1];
设置&#39; next&#39;指向已分配内存的[size]部分的指针:
[[ sizeof(MemPool) ][ size ]]
^ ^
| |
newPool newPool->next
3
newPool->end = newPool->next + size;
设置&#39;结束&#39;指向已分配内存结尾的指针:
[[ sizeof(MemPool) ][ size ]]
^ ^ ^
| | |
newPool newPool->next newPool->end
也许&#39; next&#39;应该指向一些下一个池节点?如果它是一个指向自定义内存的指针,那么无用的可能总是计算为:
... = newPool + 1;
自定义内存的大小可以计算为:
... = newPool->end - (char*)(newPool + 1);
根据
size_t poolSize(void *ptr)
你无法通过void指针获得内存大小。如果它是指向池节点的一部分的指针,则可以找到节点的开始:
MemPool * pool = (MemPool*)(ptr) - 1;
然后使用&#39;结束&#39;指针找到目标大小。