int *
私は1つの0xbfde61e0のメモリアドレスを持っています。別のメモリアドレスもあります(つまりint *
、2つの場所のオフセットとして使用する2つのメモリアドレスの差を計算するにはどうすればよいですか?
質問する
25612 次
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 に答える