以下で使用した構造体を参照してください。この問題をポータブルな方法で解決したいと考えています。
構造体の絶対アドレスを見つけるために使用したコードは次のとおりです(char*)data - sizeof(struct block);
(ここで、data は構造体ブロック内のデータへのアドレスです)。この構造体では機能しませんでした。
最後のアサートが失敗する以下のテスト プログラムを作成しました。
両方の印刷に変更unsigned int free:1;
するunsigned int free;
と 12 が印刷されるため、sizeof で期待どおりの結果が得られます。
前もって感謝します。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct block {
size_t size;
struct block* next;
unsigned int free:1;
char data[];
};
int main(void)
{
struct block* avail;
struct block* b;
avail = malloc(sizeof(struct block) + 10);
printf("%zu \n", sizeof(struct block)); // prints 12
printf("%zu\n", avail->data - (char*)&avail->size); //prints 9
b = (struct block*)((char*)avail->data - 9);
assert(b == avail);
b = (struct block*)((char*)avail->data - sizeof(struct block));
assert(b == avail);
return 0;
}
編集:ここでスタックオーバーフローに関する答えを見つけたようです:
それは私に正しい絶対アドレスを与えます。