2016-03-21 22 views
0

これは私のコードです。構造内の変数のアドレス計算

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

struct test 
{ 
    unsigned int x; 
    long int y: 32; 
    unsigned int z; 
}; 

int main() 
{ 
    struct test t; 
    unsigned int *ptr1 = &t.x; 
    unsigned int *ptr2 = &t.z; 
    printf("ptr1 address is %p\n", ptr1); 
    printf("ptr2 address is %p\n", ptr2); 
    printf("size: %d", ptr2 - ptr1); 
    return 0; 
} 

これが出力されます。

ptr1 address is 0028FEDC 
ptr2 address is 0028FEE4 
size: 2 

私はここで、出力の私の理解でポイントをしないのですね。私は、出力が4になることを期待していました。長いintは私のマシン上で4バイトを占めているからです。そして、私はxとzのアドレスの違いを得ています。しかし、実際の出力ではなく、xとzのアドレスを手動で差し引いて得られる出力ではなく、意味があります。あなたが上記を見れば、私の計算によれば28FEE4-28FEDC = 8ですが、出力は2です。誰かが私の計算が間違っていると私に教えてくれますか?

+0

構造体内で32ビット符号付き整数を使用する場合は、たとえばビットフィールドの代わりにビットフィールドを使用します。 'int32_t'? –

+0

'ptr2-ptr1' = 2、' sizeof(unsigned int) 'で乗算すると、ポインターの違いをポインターの大きさでスケールする必要があります。システムでは、8バイトを取得します。 – owacoder

+0

技術的には、2つのポインタを「オブジェクト」を指しているわけではないので、2つのポインタの減算は*未定義の動作*です。 –

答えて

1

動作を説明するために、あなたはこのようなあなたの構造を見て可能性:

 
+---+---+---+ 
| x | y | z | 
+---+---+---+ 
^  ^
|  | 
&t.x &t.z 

&t.x&t.zとの差が2つの要素、&t.xから&t.yへの最初の1、その後、&t.yから1までです&t.z

3種類すべてが同じサイズであり、コンパイラが構造内にパディングを追加していないため、この動作が有効であることに注意してください。

+0

アドレスの値のために私はこれを考えていたようで、ポインタ型でスケールするのを忘れてしまったようです。ありがとう! –

+0

そしてパッディングに関する注意をお寄せいただきありがとうございます。私もそれを考慮することを忘れました。 –

関連する問題