7

私は知っています:char*はcharへのポインタです。int*はintへのポインタです。

だから、私は次の2つのことを確認したいと思います:

  1. つまり、私が32ビットマシンを使用しているとすると、メモリアドレスは32ビット幅になります。つまり、char*とint*のサイズは両方とも32ビット(4バイト)ですよね?また、charのサイズ**もintのサイズと同じです*?

  2. 私が持っていると仮定します:int * ptr;

したがって、*((char * *)ptr)= 0x154を実行することは*((int *)ptr)= 0x514と同じですよね?(0x514は任意のランダムメモリアドレスです)

プラットフォーム:x86を使用しています。

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

4

2 に答える 2

12

Cでは、ポインタのサイズが同じであるとは限りません。実際には、ほとんどの実装ポインターは同じサイズになりますが、それはコンパイラーの実装の詳細です。

Cに関するよくある質問から:

古いHP3000シリーズは、バイトアドレスとワードアドレスで異なるアドレス指定スキームを使用しています。したがって、上記のいくつかのマシンと同様に、char*およびvoid*ポインターには、他のポインターとは異なる表現が使用されます。

使用している「メモリモデル」に応じて、8086ファミリプロセッサ(PC互換)は16ビットデータポインタと32ビット関数ポインタを使用する場合があります。

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

于 2013-02-16T17:42:17.793 に答える
1

技術的に言えば、C標準はsizeof(char)== 1のみを保証し、残りは実装次第です。しかし、最新のx86アーキテクチャ(Intel / AMDチップなど)では、かなり予測可能です。

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

実際には、ポインターのサイズは16ビットシステムでは2、32ビットシステムでは4、64ビットシステムでは8になりますが、特定のシステムに依存しても何も得られません。サイズ

于 2013-02-16T17:42:09.610 に答える