私はリンクリストを使用して、いくつかのメモリ管理(+ free
pool
+ malloc
)の実装に探していた、と私はそれらのほとんどには、各ノードは、このようなものであることが判明:次のポインタがノードの最上部の近くにあるのはなぜですか?
typedef struct node{
int usedSize;
node* next;
char mem[100];
}
、その後free(ptr)
でなければなりません。
free(void* ptr){
node* item = (node*)((char*)ptr - sizeof(node*) - sizeof(int));
\\some code to put the "item" back to the pool
}
私の質問はこれです: は、なぜ私たちは「ポインタ操作」を避けるために、構造体の先頭にchar mem[100];
を置くべきではないのですか?
結果は次のとおりです。
typedef struct node{
char mem[100]; // moved to the beginning
int usedSize;
node* next;
}
、その後free(ptr)
は簡単です:
free(void* ptr){
node* item = (node*)((char*)ptr);
\\some code to put "item" back to the pool
}
感謝。
すべての割り当てが正確に100バイトであれば正常に動作します。しかし、割り当てのサイズが異なる場合、どのように割り当てのサイズを見つけるのですか?割り当ての直前にサイズを置くと、単純になります。 – rici
thatnks @riciしかし、私はそれを見つける必要はありません、私は ノードを使用してアクセスすることができます - > usedSize 私は何かが不足していますか? – mvk
私が気づいていなかった答え(3)に感謝@jxh。 – mvk