7

int *私は1つの0xbfde61e0のメモリアドレスを持っています。別のメモリアドレスもあります(つまりint *、2つの場所のオフセットとして使用する2つのメモリアドレスの差を計算するにはどうすればよいですか?

4

3 に答える 3

6

思ったほど簡単です。

int a = 5;
int b = 7;

int *p_a = &a;
int *p_b = &b;

int difference = p_b - p_a;

これにより、の倍数として差が生じることに注意してくださいsizeof(int)。バイト単位の違いが必要な場合は、次のようにします。

int differenceInBytes = (p_b - p_a) * sizeof(int);

特定のコードまたは特定のアプリケーションがなければ、それ以上の詳細を知ることはできません。

于 2012-10-11T22:34:48.993 に答える
6

この情報の使用方法について詳しく知りたいのですが。それははるかに簡潔な答えになる可能性があります。

ともかく。通常何が起こるか:

int a = 1;
int b = 2;
int * w = &a; //0xbfdfa900 - These are right next to each other on the stack since
int * x = &b; //0xbfdfa904   they were declared together
int y = (int)w;
int z = (int)x;

int diff = w - x; // There's a 4 byte difference in memory, but I'd get diff = 1
                  // here because the compiler knows they're ints so I'm getting
                  // diff/sizeof(int)

int pdiff = y - z; // Now I'm going to get the number of bytes difference, so 
                   // pdiff = 4 as this is due to using the address as a raw value

2つのポインタ間の2つの異なるオフセットを取得する方法があります。明らかに、スタック上でポインターが隣り合っていない場合、値は変化し始めます。

int a = 1;
int arr[5] = {0};
int b = 2;
int * w = &a; //0xbfdfa900 - These are right off by 24 bytes (6 * sizeof(int))
int * x = &b; //0xbfdfa918   because we have 5 more ints there

2つの変数間の距離とタイプが異なるほど、2つの変数間の明らかな「オフセット」が失われます。つまり、これは無意味になり始めます。これが、ポインタ演算が実際に配列でのみ機能する理由です(配列は特定のタイプの連続したメモリとして知られているため)。あなたの場合のように:

int * one = &somenum;      // 0xbfde61e0
int * two = &someothernum; // 0xbfbf69e0
printf("%d\n", (int)two-(int)one);
2029568 bytes

これらはかなり離れています。だからあなたはそれらを引くことができます、しかし私はあなたがこれをする理由がわかりません。

于 2012-10-12T15:31:44.797 に答える
0

これで相殺されると思います。

int *a = &somevar;
int *b = &anotherintvar;
int offset = b - a;
于 2012-10-11T22:34:04.390 に答える