我正在尝试创建一个内存分配系统,其中一部分涉及在指针位置存储整数以创建一种标头。我存储了几个整数,然后是两个指针(位于内存中的下一个和上一个位置)。
现在我正在试图找出是否可以将指针存储在我以后可以用作原始指针的位置。
int * header;
int * prev;
int * next;
...
*(header+3) = prev;
*(header+4) = next;
然后......
headerfunction(*(header+4));
将使用指向内存中“下一个”位置的指针执行操作。
(仅供参考的代码)
非常感谢任何帮助或建议!
答案 0 :(得分:0)
不要直接指针操作。结构是为了消除您直接这样做的需要。
相反,做一些更像这样的事情:
typedef struct
{
size_t cbSize;
} MyAwesomeHeapHeader;
void* MyAwesomeMalloc(size_t cbSize)
{
MyAwesomeHeapHeader* header;
void* internalAllocatorPtr;
size_t cbAlloc;
// TODO: Maybe I want a heap footer as well?
// TODO: I should really check the following for an integer overflow:
cbAlloc = sizeof(MyAwesomeHeapHeader) + cbSize;
internalAllocatorPtr = MyAwesomeRawAllocator(cbAlloc);
// TODO: Check for null
header = (MyAwesomeHeapHeader*)internalAllocatorPtr;
header->heapSize = cbSize;
// TODO: other fields here.
return (uint8_t*)(internalAllocatorPtr) + sizeof(MyAwesomeHeapHeader);
}
答案 1 :(得分:0)
你正在做的事情是不安全的,因为你正在尝试写一个未被标题指向的内存位置*(header+3)
它将尝试写入远离标题指针和放大器12字节的其他内存位置;如果这个新内存由另一个变量持有,那么它将导致问题。
首先,你可以分配一个大内存和放大器。然后,起始地址将为您提供内存源,您可以在结构的帮助下使用一些起始字节或内存来控制剩余内存的其他部分。
答案 2 :(得分:0)
Akp是正确的,只是看看你想要在你的代码段中完成什么,如果你试图在头文件中存储整数指针,标题应该这样定义:
int **header;
然后应该为它分配内存。
关于实际的内存分配,如果在Unix机器上,你应该查看brk()系统调用。
答案 3 :(得分:0)
您正在构建一个内存分配系统,因此我们假设您有一个内存主干,您可以自由使用它来管理分配和释放。
根据您的问题,header
指针分配在heap
内存中(由编译器和库) - 您可能想知道使用该内存是否安全,因为你正在分配内存。这取决于您的系统,以及是否有另一个(系统)内存分配管理。
但你可以做的是
main() {
void *header;
void *prev;
void *next;
manage_memory_allocations(&header, &prev, &next); // never returns
}
在这种情况下,指针是在堆栈上创建的 - 因此分配取决于处理器堆栈指向的内存。
注意“永不返回”,因为只要主结束,内存就会被“释放”。