2017-10-05 13 views
-1

を実行するためにoffsetofは使用して私は、マクロoffsetof()を使用して構造体memebersをアクセスしてる学ぶしようとしていたと私は、この例How can I access structure fields by name at run time? にこの行を実行しました:ポインタ算術演算の例に

//Set the value of 'a' using pointer arithmetic 
*(int *)((char *)structp + offsetf) = 5; 

は私に迷惑を与えます。 ポインタをchar *にキャストしてからint *に戻すのはなぜですか?

+0

ようこそスタックオーバーフロー。別の質問を参照することは問題ありませんが、私たちが行く必要がなくてもあなたの質問を分かりやすくすることは重要です。私たちは何が起こっているのかを理解するために、コードの断片をもっと見る必要があります。我々は推測できる。私たちはする必要はありません。 MCVE([MCVE])の作成についてお読みください。 –

答えて

0

*を参照すると、int*にキャストされたものがあるので、データにアクセスして5に設定することができます。

キャストchar *へのキャストは、キャストchar *int *は、すべてが整数値であるために簡単です。

2

offsetfは、おそらくのバイトオフセットの希望の構造体フィールドを含んでいるため、構造体ポインタを "バイトポインタ"型にキャストする必要があります。このキャストのために、(char *)structp + offsetf部分式のポインタ演算は、charオブジェクト(バイト単位)の観点から、正確に欲しいものとして実行されます。

第2に、上記の部分式は、所望のデータフィールドを指すタイプchar *のポインタを与える。しかし実際には、データフィールドは明らかにタイプintを持っています。したがって、そのデータフィールドにアクセスするには、タイプにchar *ポインタをキャストする必要があります。その後、単一*演算子を使用して、そのデータフィールドへの読み取り(または書き込み)アクセスを実行できます。あなたのケースでは

5structpが指すオブジェクト内のバイト・オフセットoffsetfに位置intデータフィールドに書き込まれています。

+0

ありがとうございました – user8565662

+0

@AnT:謝罪 - 誤読。あなたは正しい。私はすぐにこれを削除します。 –