extern char etext
、end
およびから取得したポインタ アドレスがありedata
ます。を使用して変数のアドレスも取得し&<Variable Name>
ました。どちらも 16 進数のポインター アドレスです。
これらのアドレスを 10 進数で計算する必要があります。どうすればいいですか?アドレスを 10 進数の int に変換する必要があるため、アドレスを差し引いてメモリ セグメントのサイズを確認できます。
extern char etext
、end
およびから取得したポインタ アドレスがありedata
ます。を使用して変数のアドレスも取得し&<Variable Name>
ました。どちらも 16 進数のポインター アドレスです。
これらのアドレスを 10 進数で計算する必要があります。どうすればいいですか?アドレスを 10 進数の int に変換する必要があるため、アドレスを差し引いてメモリ セグメントのサイズを確認できます。
数学は数学です。どのベースで行うかは問題ではありません。とにかく、コンピューターはベース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);
ポインタを使って算術演算を行うことができます。「単位」は 1 ではなく、指しているオブジェクトのサイズであることに注意してください。したがって、p が整数へのポインターである場合、p+1 と p の間のアドレスの差は 4 バイト以上になる可能性があります。
アドレスで算術演算を行いたい場合は、char へのポインターを使用するか、それらをそのようなポインターに変換する必要があります。
「16 進変数」はなく、何らかの表現で出力できる変数です。int
さらに、標準は、 がポインター オブジェクトを保持できることを保証しません。C99 または C11 を使用する場合は、オプションの型(u)intptr_t
を使用してこれを行うことができます。
uintptr_t n = (uintptr_t)(void *)etext;
どちらも 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' が保持されます。