1つのdouble変数と3つのint変数(全部で4つの変数)を含む構造体定義が与えられた場合、pが値0x1000のこの構造体へのポインターである場合、p ++にはどのような値がありますか?
これは宿題の問題ではないので、心配しないでください。テストの準備をしているだけで、この練習問題を理解できません。ありがとう
これはCです。はい、増分した後のpの値が必要です。これは32ビットマシンです
1つのdouble変数と3つのint変数(全部で4つの変数)を含む構造体定義が与えられた場合、pが値0x1000のこの構造体へのポインターである場合、p ++にはどのような値がありますか?
これは宿題の問題ではないので、心配しないでください。テストの準備をしているだけで、この練習問題を理解できません。ありがとう
これはCです。はい、増分した後のpの値が必要です。これは32ビットマシンです
struct foobar *p;
p = 0x1000;
p++;
と同じです
struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
答えは、少なくとも
sizeof(double) + (3*sizeof(int))
「少なくとも」である理由は、コンパイラーが、基礎となるアーキテクチャーが必要に応じてパディングを追加して、アラインメント制約に適合させることが多かれ少なかれ自由であるためです。
たとえば、古い CDC マシンのような 64 ビット ワードのマシンがあるとします。(地獄、そのうちのいくつかは 60 ビットの単語を持っていたので、さらに奇妙になるでしょう。) さらに、そのマシンでsizeof(double)
は が 64 ビットで、sizeof(int)
が 16 ビットであると仮定します。コンパイラは、構造体を次のようにレイアウトする場合があります。
| double | int | int | int | 16 bits padding |
そのため、構造体全体を 2 つのメモリ参照でマシンに渡すことができ、シフトや混乱は必要ありません。その場合、sizeof(yourstruct_s) は 16 になりますが、ここで
は48 14sizeof(double)+ (3*sizeof(int))
しかありません。
アップデート
これは 32 ビット マシンでも同様であることに注意してください。その場合、3ワードに収まるようにパディングが必要になる場合があります。バイトまでアドレス指定しない最新のマシンを知らないので、今は例を見つけるのが難しいかもしれませんが、古いアーキテクチャの多くはこれを必要とするでしょう.
ポインタ演算は、ポインタ型のサイズ単位で行われます。
したがって、構造体へのポインターで行うと、 p はバイト単位でp++
進みます。つまり、演算子sizeof *p
を使用した構造体の大きさをコンパイラに問い合わせるだけです。sizeof
p = p + sizeof(YourStruct)
パディングをオフにしない場合、コンパイラは sizeof が返す値を自由に決定できます。