2013-02-16 7 views
7

私は知っています: char *はcharへのポインタです。 および int *はintへのポインタです。char *のサイズはint *のサイズと同じですか?

だから、私は二つのこと、以下を確認したい:

  1. は、だから今、私は32ビットマシン上で午前と仮定し、そのメモリアドレスは32ビット幅であることを意味します。 したがって、char *とint *のサイズは両方とも32ビット(4バイト)です。 char * *のサイズもint *のサイズと同じですか?

  2. 私には: int * ptr;

このようになりました*((CHAR * *)PTR)をやっ= 0x154、右= 0x514同じ*((int型*)PTR)と同じですか? (0x514はランダムなメモリアドレス)

プラットフォーム:私はx86です。

P .:私が知っているのは、型キャストはコードとして推奨される方法ではありません。しかし、私はカーネルコーディングをしているので、私は型キャストを行う必要があります!

+0

標準がそれを言っていなくても、それが実際に異なる環境を見つけるのは簡単だろうとは思えません。 – Mysticial

+0

実際にはサイズは同じですが、位置合わせの要件は異なります。 – DCoder

+0

"カーネルコーディング"を行っている場合、これはコードが実行できるプラットフォームの数をすでに制限しています。サポートされているものはOSの仕様で確認してください。 –

答えて

11

Cのポインタはnot guaranteed to have the same sizeです。現実には、ほとんどの実装のポインタは同じサイズになりますが、これはコンパイラの実装の詳細です。 C Faqから

古いHP 3000シリーズは、バイトワードアドレスよりも アドレスに異なるアドレス指定方式を使用しています。 8086ファミリのプロセッサ(PC 互換機)、それはので、使用中の ``メモリモデル「」に応じて、他のポインタ

のためのよりのchar *とvoid *型 ポインタのための異なる表現を使用しています 上記のマシンのいくつかのようなことがあり16ビットのデータポインタと32ビットの関数 ポインタを使用してください。

*((char *)ptr) = 0x154*((int *)ptr) = 0x154と同じではありません。ポインタを逆参照しているため、charのサイズとintのサイズのデータ​​を、ptrが指す場所に書き込むことになります。 8ビットのcharと32ビットのintを仮定すると、ptr*((int *)ptr) = 0x154に割り当てられたメモリアドレスに0x154が書き込まれ、ptrに割り当てられたアドレスから始まる4バイトに0x0000000154が書き込まれます。

+0

短い答えですが、素晴らしいリンクです。たとえば、「古い、ワードでアドレス指定されたPrimeマシンは、単語ポインタ(int *)より大きなバイトポインタ(char *)を必要とすることで有名でした。」 –

+0

@ shf301 :*((char **)ptr)= 0x154に編集しました。 – user1599964

+0

@ user1599964私はそれがあなたの例では異なる値を持っていると思われるtypoだと仮定しました。 - 'char **'または 'int *'へのキャストは非常に異なることを意味し、直接比較できません。彼らは間接指向の異なるレベルであり、同じことをやっていることさえ近くにありません。 – shf301

1

技術的に言えば、C標準ではsizeof(char)== 1だけが保証され、残りは実装されています。しかし、現代のx86アーキテクチャ(例えば、Intel/AMDチップ)では、それはかなり予測可能である。

おそらく、プロセッサは16ビット、32ビット、64ビットなどと記述されていると聞いたことがあります。これは通常、プロセッサが整数にNビットを使用することを意味します。ポインタはメモリアドレスを格納し、メモリアドレスは整数であるため、これはポインタに使用されるビットの数を効果的に示します。 sizeofは通常バイト単位で測定されるため、32ビットプロセッサ用にコンパイルされたコードはポインタのサイズが4(32ビット/バイト/バイト)と報告され、64ビットプロセッサ用のコードはポインタのサイズが8 (64ビット/ 8ビット/バイト)。これは、32ビットプロセッサ用の4GBのRAMの限界です。各メモリアドレスが1バイトに対応する場合、より多くのメモリを扱うためには、32ビットより大きい整数が必要です。

実際には、ポインタは、16ビットシステムではサイズ2(見つかった場合)、32ビットシステムでは4、64ビットシステムでは8ですが、何も得られません所定のサイズに頼っている

+0

これは、[標準委員会も考慮した] 36ビットまたは48ビットアーキテクチャを実行するまでは問題ありません(http://stackoverflow.com/questions/6971886/exotic-architectures-the-standard-committee-cares-about )。 –

関連する問題