本の問題13.9、「コーディングインタビューのクラッキング」について質問があります。問題は、メモリの割り当てをサポートする整列された割り当ておよび解放関数を作成することです。その答えのコードは次のとおりです。
void *aligned_malloc(size_t required_bytes, size_t alignment) {
void *p1;
void **p2;
int offset=alignment-1+sizeof(void*);
if((p1=(void*)malloc(required_bytes+offset))==NULL)
return NULL;
p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); //line 5
p2[-1]=p1; //line 6
return p2;
}
私は5行目と6行目と非常に混同しています。すでにp1にオフセットを追加しているのに、なぜ「and」を実行する必要があるのですか?[-1]はどういう意味ですか?よろしくお願いします。