voidポインタを取得する関数を作成したいと思います。このポインタは、任意のユーザーデータを指します。これは現在は関係ありません。これは、このユーザーデータを説明する記述子としてより重要です。このデータの下にあります。アドレスを取得したいのですが、2つの異なる解決策があります。
struct data_desc {
size_t size;
data_type_t type;
/* And so on... */
};
/* Operate on the descriptor */
void operate_on_data(void *ptr)
{
struct data_desc *desc;
/* Now I want to get the desc /*
/* This is the first approach, simply fails */
desc = ((struct data_desc *)ptr) - sizeof(struct data_desc);
/* This is the second, it works...*/
desc = (struct data_desc *)ptr;
desc--;
/* Do something with desc */
}
ご覧のとおり、記述子のアドレスを取得するために2つの異なるアプローチを使用しています。最初の方が自然だと思いましたが、うまくいきません。優先順位の問題を回避するために、より多くの括弧を使用しました。
私はこれらの方法が安全ではないことを知っています。最初のものは機能しません、なぜですか?この動作の背後にある理由は何ですか?
前もって感謝します!