Turbo C コンパイラと GNU コンパイラで次のコードを実行しました。
int main()
{
char *cptr;
printf("%d\n",sizeof(cptr));
return 0;
}
そして、Turbo C の実行で' 2 ' を出力し、GNU コンパイラの実行で' 4 ' を出力しました。私は64ビットマシンを使用しています。そのような違いの背後にある事実を私に説明できる人はいますか?
ビンテージの Turbo C は、デフォルトで小さいポインタを持つ 16 ビット DOS マシン用に構築されている可能性があります。
DOS ベースの Turbo-C コンパイラを考えると、アドレスは 0x0000 ~ 0xFFFF (0 ~ 65535) の範囲に制限されるため、ポインタのサイズは 2 バイトになります。一方、32 ビット GNU コンパイラを考えると、そこで数百万のアドレスが作成されるため、サイズは 4 バイトになります。
ポインタのサイズは、使用している C コンパイラのみに依存し、OS には依存しません。
Turbo C は 16 ビットなので、2 を取得しsizeof(cptr)
ます。
マシンがネイティブで 64 ビットだからといって、そのマシンで実行するすべてのソフトウェアがそれを利用できるわけではありません。64 ビット マシン (およびサポート ソフトウェア) は、32 ビットと上位互換性を持つように設計されています。その結果、32 ビット マシン用に作成されたソフトウェアを実行できます。
基本的に、ポインターのサイズは、ポインターが使用する整数型のサイズです。正確に言えば、32 ビット プラットフォームでは 32 ビット int、64 ビット プラットフォームでは 64 ビット int (long long) です。ただし、使用しているコンパイラにも依存することに注意してください。つまり、64 ビット プラットフォームでも、32 ビット コンパイラ (または 16 ビット) を使用している場合でも、ポインタの型には 32 ビット int が使用されます。あなたの結果から、ターボ C コンパイラは間違いなく 64 ビットではないようです (間違って覚えていなければ、16 ビットである必要があります)。あなたのgccコンパイラは実際の64ビットです。
プラットフォームが異なれば、特定のポインター型のサイズも異なる場合があります。それはすべて、基盤となるメモリ アーキテクチャと、任意のプロセスで利用可能なアドレス空間に依存します。ポインター型が常に特定のサイズを持つと想定しないでください。