0

我正在尝试创建一个内存分配系统,其中一部分涉及将整数存储在指针位置以创建一种标题。我存储了几个整数,然后是两个指针(指向内存中下一个和上一个点的位置)。

现在我想弄清楚是否可以将指针存储在以后可以用作原始指针的位置。

int * header;
int * prev; 
int * next;
...
*(header+3) = prev; 
*(header+4) = next;

然后后来...

headerfunction(*(header+4));

将使用指向内存中“下一个”位置的指针执行操作。

(代码仅供说明)

非常感谢任何帮助或建议!

4

4 回答 4

0

Akp 是正确的,只需查看您要在代码段中完成的操作,如果您尝试将整数指针存储在标头中,标头应定义如下:

int **header;

然后应该为它分配内存。

关于实际的内存分配,如果在 Unix 机器上,你应该查看 brk() 系统调用。

于 2013-02-12T05:03:36.490 回答
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);
 }
于 2013-02-12T04:49:18.937 回答
0

你所做的一切都是不安全的,因为你正在尝试写入一个没有被标头指向的内存位置,因为*(header+3)它会尝试写入距离标头指针 12 字节的其他内存位置,并且如果这个新内存被另一个持有变量那么它将导致问题。

您可以首先分配一个大内存,然后起始地址将为您提供内存来源,您可以在其中使用一些起始字节或内存来借助结构控制剩余内存的其他部分。

于 2013-02-12T04:50:40.360 回答
0

你正在构建一个内存分配系统,因此我们假设你有一个内存主干,你可以自由地使用它来管理分配和释放。

根据您的问题,header指针是在heap内存中分配的(由编译器和库) - 您可能想知道使用该内存是否安全,因为正在分配内存。这取决于您的系统,以及是否有另一个(系统)内存分配管理。

但你能做的是

main() {
  void *header;
  void *prev;
  void *next;

   manage_memory_allocations(&header, &prev, &next); // never returns

}

在这种情况下,指针是在堆栈上创建的——因此分配取决于处理器堆栈指向的内存。

请注意“永不返回”,因为一旦main结束,内存就会“释放”。

于 2013-02-12T05:20:20.187 回答