0

私はメモリ割り当てシステムを作成しようとしていますが、その一部には、ポインターの場所に整数を格納して、一種のヘッダーを作成することが含まれます。いくつかの整数を格納し、次に 2 つのポインター (メモリ内の次のスポットと前のスポットへの位置を含む) を格納します。

現在、後で元のポインターとして使用できる場所にポインターを保存できるかどうかを調べようとしています。

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

メモリ割り当てシステムを構築しているため、割り当てと解放を管理するために自由に使用できるメモリのトランクがあると仮定します。

あなたの質問によると、headerポインタは(コンパイラとライブラリによって)メモリに割り当てられます-メモリを割り当てheapいるので、そのメモリを使用しても安全かどうか疑問に思うかもしれません。それはあなたのシステムに依存し、別の(システム)メモリ割り当て管理があるかどうかに依存します。

しかし、あなたができることは

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

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

}

この場合、ポインタはスタック上に作成されるため、割り当てはプロセッサ スタックが指すメモリに依存します。

メインが終了するとすぐにメモリが「解放」されるため、「戻らない」ことに注意してください。

于 2013-02-12T05:20:20.187 に答える
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 に答える