2011-01-01 2 views
8

新しいプログラミング言語を設計する際に、C intとポインタがマシン上で同じサイズであると想定するのは安全でしょうか?ポインタがCのintのサイズであると仮定するのは安全でしょうか?

+4

おそらくスタックオーバーフローの質問。 – Orbling

+0

も参照してください:[C++:intへのポインタをキャストして後でポインタに戻っても安全ですか?](http://stackoverflow.com/questions/3567905/c-is-it-safe-to-cast-pointer- int-と-after-later-back-to-pointer-again) – Shog9

+1

[sizeof(int)== sizeof(void \ *)?]の重複が可能です(http://stackoverflow.com/questions/502811/sizeof- int sizeof-void) – Amro

答えて

16

いいえポインタは、整数よりも大きくても小さくても構いません。何らかの理由でポインタを整数として渡す必要がある場合(ポインタ、算術ではなく整数を実行する場合など)、intptr_tに収まることが保証されています。

他の回答で示唆されているようにsize_tに収まることは保証されていませんが、実際にはそうではありません。

1

いいえ、ポインタはintptr_tと同じサイズでなければなりません。

+0

sizeof(int)!= sizeof(int *)と思われるマシンとコンパイラが現時点で使用しているようです...同様のものが安全であれば、intには関係しません。 – compman

+1

@ user9521:Danは言うとおり、常に 'size_t'型を使います。コードをx64に変換する際の主な問題は、intサイズが同じであると仮定した人の蔓延であり、そのプラクティスは長年にわたって非難されていました。 – Orbling

+2

-1 - 事実、あなたは正しいと思われますが、間違っています。セグメント化された(および他の種類の病的な)メモリアーキテクチャでは、size_tはintptr_tより小さくなることがあります。 http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t。 –

1

プラットフォームで定義されているデータ型のサイズを意味すると思います。私の知る限りでは、Cはデータ型に特定のサイズを定義しません。あなたの質問への答えは、例えばwin32のsizeof(int)== sizeof(pointer)== 4バイトですが、win64のsizeof(int)== 4とsizeof(pointer)== 8

+2

C言語は、いくつかの固定サイズのタイプ(uint32_tは正確に32ビット)と同様に、いくつかの最小データサイズ(size_tは少なくとも16ビットでなければならない)、関係サイズ(shortはshortより短くできない)を定義します。 –

+0

@Joeあなたが正しいです、私はintとポインタの相対的なサイズに私の答えを制限する必要があります。 – Gaurav

+0

@Joe:uint32_tはC99のC標準(http://en.wikipedia.org/wiki/Stdint.hを参照)で最初に表示されたようです。これはstdint.hが標準の一部になったからです。 (実装がC99の前にそれを提供するかどうかは分かりません)。 – compman

3

いいえ、特に64ビット環境で:

LP64これは、* nixの環境をカバーしていますが、同じではLLP64のWindowsで真です。

5

いいえ、まったくありません。多くのコンパイラでは、同じサイズではありません。

1

いいえ;私のMacOS X 10.6.5上で。マシンでは、intは32ビットで、ポインタはデフォルトで64ビットです。

あなたは右のサイズ、あまりにポインタを保持#include <inttypes.h>(または<stdint.h>)を使用するとuintptr_tだ整数が必要な場合 - あなたはC99をサポートしている、またはそれをシミュレートすることができますと仮定します。

-2

私はLinuxカーネルがポインタをunsigned longとして渡すと信じています。彼らは少なくともポインタと同じサイズであることが保証されています:)

+3

Linuxはそれらが同じサイズであることを保証します。 C言語はまったく約束をしません。 –

+0

これは実際には良い答えです。なぜなら、いくつかのカーネルの振る舞いと、C言語の規則の無視を示しているからです。 OpenSSLの[Bug 4441:VIA C7-Dプロセッサ:Hang in 30-test_afalg.t](https://rt.openssl.org/Ticket/Display.html?id=4441)のように、実際にはバグが発生します。これは、カーネルがポインタ(i686,32ビット)を大きなサイズの積分(unsigned long、 '__u64'に格納)にキャストしているためです。 – jww

関連する問題