1

extern char etextendおよびから取得したポインタ アドレスがありedataます。を使用して変数のアドレスも取得し&<Variable Name>ました。どちらも 16 進数のポインター アドレスです。

これらのアドレスを 10 進数で計算する必要があります。どうすればいいですか?アドレスを 10 進数の int に変換する必要があるため、アドレスを差し引いてメモリ セグメントのサイズを確認できます。

4

4 に答える 4

3

数学は数学です。どのベースで行うかは問題ではありません。とにかく、コンピューターはベース2でのみ動作しています。入力時または出力時にのみベース マターが実行されます。ポインターをポインターとして解釈すると、ポインターのバイト単位の算術演算が可能になりchar *ます。

ptrdiff_t segmentSize = (char *)segmentEndAddress - (char *)segmentStartAddress;

printf("Segment size in base 10: %td\n", segmentSize);
printf("Segment size in base 16: %tx\n", segmentSize);
printf("Segment size in base  8: %to\n", segmentSize);
于 2013-01-27T16:41:38.403 に答える
2

ポインタを使って算術演算を行うことができます。「単位」は 1 ではなく、指しているオブジェクトのサイズであることに注意してください。したがって、p が整数へのポインターである場合、p+1 と p の間のアドレスの差は 4 バイト以上になる可能性があります。

アドレスで算術演算を行いたい場合は、char へのポインターを使用するか、それらをそのようなポインターに変換する必要があります。

于 2013-01-27T16:45:27.533 に答える
1

「16 進変数」はなく、何らかの表現で出力できる変数です。intさらに、標準は、 がポインター オブジェクトを保持できることを保証しません。C99 または C11 を使用する場合は、オプションの型(u)intptr_tを使用してこれを行うことができます。

uintptr_t n = (uintptr_t)(void *)etext;
于 2013-01-27T16:41:47.867 に答える
1

どちらも 16 進数のポインター アドレスです...これらのアドレスを 10 進数で計算する必要があります。どうすればいいですか?

10 進数と 16 進数は単なる表現です...数値を表示する方法です。しかし、10 と書いても 0xA と書いても同じ数字です。ポインターは数値であり、その数値は 10 進数または 16 進数で表すことができますが、それでも単なる数値です。したがって、次のようなことができます。

char *foo = "A dog and a cat";
int offset = 4;
char fifthChar = *(foo + offset);

基本的に、ポインターに 4 を追加しfoo、結果を逆参照するためfifthChar、文字 'g' が保持されます。

于 2013-01-27T16:45:45.220 に答える