C言語 アドレスって最大でどれくらいのサイズになるのでしょうか?

C言語関連88閲覧

ベストアンサー

0

あらま! >printfを1から実装していて%pのフォーマット指定子に対応させようとしているのですが が目的だったのね ポインタの大きさに影響されない案を思いついちゃった! これはどう? → union経由の読出しはエンディアンに依存するので、 <endian.h>を調べて環境に合うような条件コンパイルできるようにしたいが、省略 #include <stdio.h> #include <unistd.h> #include <string.h> #define PTR_SIZE sizeof(void*) typedef union ptr { _ void* p; _ char byte[ PTR_SIZE ]; }ptr; ―文字数制限回避のため 続く―

ThanksImg質問者からのお礼コメント

より詳しく教えていただきありがとうございます!!

お礼日時:4/7 23:24

その他の回答(4件)

2

【アドレス自体をint型で】 #include <stdint.h> これで intptr_t 型、uintptr_t 型等が使える可能性があります。 《参考》 Windows の場合は INT_PTR型とすることも出来ます。(他に UINT_PTR, LONG_PTR, DWORD_PTR, WPARAM, LPARAM など)

2人がナイス!しています

0

>アドレス自体をint型で扱おうと思った う~ん…。 素直にchar *ptrやvoid *ptr等で保持すれば良いのでは?

今、printfを1から実装していて%pのフォーマット指定子に対応させようとしているのですが、アドレスの出力の時に文字列に置き換えて出力しようとしてるのですが、その過程でintに変換してその後に文字列として16進数で出力しようと考えています。そうなるとポインタ型で保持するだけでは出力できないなと。。ちなみに関数はシステムコールのwriteを使います。

0

C言語自体にはおそらく規定はないのでは無いかと。 メモリアドレスの上限はシステムとコンパイラが規定します。 32bitのシステムであれば、一般のプログラムで通常に扱えるメモリアドレスは、符号無しの32bit迄です。 64bitになれば、それが64bitになります。 Windows等ではintは、符号付き32bitなので、どちらも扱えきれません。 32bitであれば、unsigned int 64bitであれば、unsigned long long int であれば、桁数的には扱えます。