2012-06-11 27 views
7

次のプログラムでsizeof(int)sizeof(int*)と異なる値を返すのはなぜですか?sizeof(int)がsizeof(int *)と異なるのはなぜですか?

はここで小さなプログラムである:私は、整数ポインタのサイズを覚えて今まで4バイト(GCCコンパイラ)

4 
8 

されています。ここ

int main(){ 
    std::cout<<sizeof(int)<<endl; 
    std::cout<<sizeof(int*)<<endl; 
    return 0; 
} 

されて出力されます。ポインタの正しいサイズを確認するにはどうすればよいですか?それはコンピュータに依存していますか?私はUbuntuのに12.04

# lsb_release -a 

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release: 12.04 
Codename: precise 

を実行しています

は、ポインタのサイズが8バイト(標準サイズ)一定ではないです。

+7

64ビットオペレーティングシステム? – gliderkite

+1

@ ahenderson-すべてのポインタが同じサイズであることが保証されていますか? – templatetypedef

+0

また、 'uname -a'または' file 'の出力を追加します。 – 0xC0000022L

答えて

15

intint*のサイズは完全にコンパイラとハードウェアに依存します。 int*で使用されている8バイトが表示されている場合は、64ビットハードウェアがあり、これはポインタあたり8バイトに変換されます。

希望すると便利です。

+5

"おそらく64ビットのオペレーティングシステムがあります。"確かに重要なことですが、プロセスはおそらく64ビットプロセスです。 :-) –

+3

私は、標準で定義されている唯一の型が 'char'であることを追加したいと思います。 'sizeof(char)'は常に '1'です。 – LihO

+1

@LihO:' char'のサイズは実際に標準では定義されていませんが、 'sizeof' expressは_numberのchars_の結果です。 –

4

ポインタのサイズは、システム、コンパイラ、およびアーキテクチャに依存します。 32ビットシステムでは通常32ビットになりますが、64ビットシステムでは通常64ビットになります。

ポインタを後でポインタに戻すために整数にポインタを格納しようとすると、通常の(関数ではない)ポインタ型を保持するのに十分な大きさの整数型の型intptr_tを使用できます。

7

sizeof(char) == 1

は、(*)他の保証はありません。

実際には、ポインタは、16ビットシステムではサイズ2、32ビットシステムでは4、64ビットシステムでは8です。


(*)James Kanzeのコメントを参照してください。

+1

ありがとうございます:)私の疑いは明らかです – yogi

+2

'sizeof(char)<= sizeof(short)<= sizeof(int)<= sizeof(long)<= sizeof(long long)'も保証されています。 'sizeof(float)<= sizeof(double)<= sizeof(long double)'と同様です。 (すべてのサイズが完全であるという保証もありますが、それは多かれ少なかれ理解されています) –

+0

@JamesKanze冗談になりたい、良いコメント。私は質問と質問者のタイプに応じてできるだけ明確な回答を書こうとしました。 – gliderkite

2

32ビットシステムの場合、「事実上の」規格はILP32です。すなわちint、 longおよびpointerはすべて32ビット数です。

64ビットシステムでは、主なUnixの「事実上の」標準はLP64 - で、ポインタは64ビットです(ただしintは32ビットです)。 Windowsの64ビットの 標準はLLP64です(ロング・ロング)。ポインタは64ビットです(ただし、長整数の は両方とも32ビットです)。

一部のUnixシステムでは、ILP64組織を使用していました。

これらのデファクトスタンダードのいずれも、C標準 (ISO/IEC 9899:1999)で法制化されていませんが、すべてそれによって許可されています。

あなたは可搬性と懸念している、またはあなたが タイプの名前は、サイズを反映したい場合は、 次のマクロが用意されていヘッダ、見ることができます:

int8_t int16_t int32_t int64_t

int8_tが8ビットであることが保証され、そしてint16_t 16ことが保証されビットなど

このquestionを参照してください。

+0

'int8_t'などが存在するという保証はありません。移植性を最大限にするには、もっと大きなものが必要なことが分かっていなければ 'int'を使い、入力を検証してください。 –

+0

@JamesKanze:??? はかなり標準です。 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html –

+0

@OAOD「」は、これらのタイプが定義されている標準的なCおよびC++ヘッダーであり、「」、「int8_t' et al。オプションとしてマークされています。 Cの標準では、ハードウェアがそれらをサポートしている場合、それらは「必須」と考えています。それはどんなレートでも意図です。しかし、それらは正確なサイズの型でなければならず、符号付きの型は2の補数でなければなりません。 8ビットのバイトを持たないマシン、または2の補数でないマシンでは、それらは定義されません。 (Posixはそれらを必要とし、実装可能なハードウェアを制限しています。) –

関連する問題