これは私のコードです。構造内の変数のアドレス計算
#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です。誰かが私の計算が間違っていると私に教えてくれますか?
構造体内で32ビット符号付き整数を使用する場合は、たとえばビットフィールドの代わりにビットフィールドを使用します。 'int32_t'? –
'ptr2-ptr1' = 2、' sizeof(unsigned int) 'で乗算すると、ポインターの違いをポインターの大きさでスケールする必要があります。システムでは、8バイトを取得します。 – owacoder
技術的には、2つのポインタを「オブジェクト」を指しているわけではないので、2つのポインタの減算は*未定義の動作*です。 –