-1

Turbo C コンパイラと GNU コンパイラで次のコードを実行しました。

int main()
{
   char *cptr;
   printf("%d\n",sizeof(cptr));
   return 0;
}

そして、Turbo C の実行で' 2 ' を出力し、GNU コンパイラの実行で' 4 ' を出力しました。私は64ビットマシンを使用しています。そのような違いの背後にある事実を私に説明できる人はいますか?

4

6 に答える 6

3

ビンテージの Turbo C は、デフォルトで小さいポインタを持つ 16 ビット DOS マシン用に構築されている可能性があります。

于 2012-05-31T14:28:33.450 に答える
2

DOS ベースの Turbo-C コンパイラを考えると、アドレスは 0x0000 ~ 0xFFFF (0 ~ 65535) の範囲に制限されるため、ポインタのサイズは 2 バイトになります。一方、32 ビット GNU コンパイラを考えると、そこで数百万のアドレスが作成されるため、サイズは 4 バイトになります。

ポインタのサイズは、使用している C コンパイラのみに依存し、OS には依存しません。

于 2012-10-12T18:50:58.153 に答える
1

Turbo C は 16 ビットなので、2 を取得しsizeof(cptr)ます。

于 2012-05-31T14:28:40.853 に答える
1

マシンがネイティブで 64 ビットだからといって、そのマシンで実行するすべてのソフトウェアがそれを利用できるわけではありません。64 ビット マシン (およびサポート ソフトウェア) は、32 ビットと上位互換性を持つように設計されています。その結果、32 ビット マシン用に作成されたソフトウェアを実行できます。

于 2012-05-31T14:30:45.213 に答える
0

基本的に、ポインターのサイズは、ポインターが使用する整数型のサイズです。正確に言えば、32 ビット プラットフォームでは 32 ビット int、64 ビット プラットフォームでは 64 ビット int (long long) です。ただし、使用しているコンパイラにも依存することに注意してください。つまり、64 ビット プラットフォームでも、32 ビット コンパイラ (または 16 ビット) を使用している場合でも、ポインタの型には 32 ビット int が使用されます。あなたの結果から、ターボ C コンパイラは間違いなく 64 ビットではないようです (間違って覚えていなければ、16 ビットである必要があります)。あなたのgccコンパイラは実際の64ビットです。

于 2012-05-31T14:35:30.820 に答える
0

プラットフォームが異なれば、特定のポインター型のサイズも異なる場合があります。それはすべて、基盤となるメモリ アーキテクチャと、任意のプロセスで利用可能なアドレス空間に依存します。ポインター型が常に特定のサイズを持つと想定しないでください。

于 2012-05-31T14:52:01.570 に答える