glibc の malloc チャンク サイズには、使用中に余分なビットが設定されますか? 私が質問している理由は、いくつかのチャンクを割り当ててから、ベース ポインターから各チャンクへの下位 8 バイト オフセットからそのサイズを出力する簡単なテスト ケースを作成したためです (ソース コードで説明されているように)。そのようです:
int main(void)
{
int* p1 = malloc(_p1);
int* p2 = malloc(_p2);
int* p3 = malloc(_p3);
printf("p3: %p %d\n",p3,_p3);
printf("p2: %p %d\n",p2,_p2);
printf("p1: %p %d\n",p1,_p1);
printf("p3-2: %5dd %5xh\n", *(p3-2), *(p3-2));
printf("p2-2: %5dd %5xh\n", *(p2-2), *(p2-2));
printf("p1-2: %5dd %5xh\n", *(p1-2), *(p1-2));
printf("p1 %p %p\n p-2\n", p1, p1-2);
printf("\n");
return 0;
}
出力例。ただし、サイズは常に 1 バイト余分に表示されます。だから私の質問は、この余分なバイトはどこから来るのですか?
p3: 0x1d4e0b0 64
p2: 0x1d4e060 64
p1: 0x1d4e010 64
p3-2: 81d 51h
p2-2: 81d 51h
p1-2: 81d 51h
p1 0x1d4e010 0x1d4e008
チャンクが使用されているときにビットが設定されているのではないかと思いましたが、チャンクを解放して正しいオフセットでサイズを調べても、同じサイズが表示されます。
私が間違っていることや、このバイトがどこから来ているのかについて、誰か詳しく教えてもらえますか?
ありがとう、