新しいプログラミング言語を設計する際に、C intとポインタがマシン上で同じサイズであると想定するのは安全でしょうか?ポインタがCのintのサイズであると仮定するのは安全でしょうか?
答えて
いいえポインタは、整数よりも大きくても小さくても構いません。何らかの理由でポインタを整数として渡す必要がある場合(ポインタ、算術ではなく整数を実行する場合など)、intptr_tに収まることが保証されています。
他の回答で示唆されているようにsize_tに収まることは保証されていませんが、実際にはそうではありません。
いいえ、ポインタはintptr_tと同じサイズでなければなりません。
sizeof(int)!= sizeof(int *)と思われるマシンとコンパイラが現時点で使用しているようです...同様のものが安全であれば、intには関係しません。 – compman
@ user9521:Danは言うとおり、常に 'size_t'型を使います。コードをx64に変換する際の主な問題は、intサイズが同じであると仮定した人の蔓延であり、そのプラクティスは長年にわたって非難されていました。 – Orbling
-1 - 事実、あなたは正しいと思われますが、間違っています。セグメント化された(および他の種類の病的な)メモリアーキテクチャでは、size_tはintptr_tより小さくなることがあります。 http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t。 –
プラットフォームで定義されているデータ型のサイズを意味すると思います。私の知る限りでは、Cはデータ型に特定のサイズを定義しません。あなたの質問への答えは、例えばwin32のsizeof(int)== sizeof(pointer)== 4バイトですが、win64のsizeof(int)== 4とsizeof(pointer)== 8
C言語は、いくつかの固定サイズのタイプ(uint32_tは正確に32ビット)と同様に、いくつかの最小データサイズ(size_tは少なくとも16ビットでなければならない)、関係サイズ(shortはshortより短くできない)を定義します。 –
@Joeあなたが正しいです、私はintとポインタの相対的なサイズに私の答えを制限する必要があります。 – Gaurav
@Joe:uint32_tはC99のC標準(http://en.wikipedia.org/wiki/Stdint.hを参照)で最初に表示されたようです。これはstdint.hが標準の一部になったからです。 (実装がC99の前にそれを提供するかどうかは分かりません)。 – compman
いいえ、特に64ビット環境で:
LP64これは、* nixの環境をカバーしていますが、同じではLLP64のWindowsで真です。
いいえ、まったくありません。多くのコンパイラでは、同じサイズではありません。
いいえ;私のMacOS X 10.6.5上で。マシンでは、int
は32ビットで、ポインタはデフォルトで64ビットです。
あなたは右のサイズ、あまりにポインタを保持#include <inttypes.h>
(または<stdint.h>
)を使用するとuintptr_t
だ整数が必要な場合 - あなたはC99をサポートしている、またはそれをシミュレートすることができますと仮定します。
私はLinuxカーネルがポインタをunsigned longとして渡すと信じています。彼らは少なくともポインタと同じサイズであることが保証されています:)
Linuxはそれらが同じサイズであることを保証します。 C言語はまったく約束をしません。 –
これは実際には良い答えです。なぜなら、いくつかのカーネルの振る舞いと、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
- 1. socket.sendtoが非ブロック操作であると想定するのは安全でしょうか?
- 2. ポインタと固定サイズのバッファは、安全でないコンテキストでのみ使用することができます
- 3. このコードソースはSQLインジェクションから「安全」であるでしょうか?
- 4. IntegerはVB.Netで常に32ビットと仮定するのは安全ですか?
- 5. レジストリハイブが常に同じであると仮定するのはどれくらい安全ですか?
- 6. errnoを常に正と仮定するのは安全ですか?
- 7. C#ポインタが「安全でない」と考えられる場合、C++ポインタも「安全でない」ことを意味しますか?
- 8. ブラウザには一般にどのJavaバージョンがインストールされていますか?1.4と仮定するのは安全でしょうか?
- 9. C++:関数へのポインタをキャストするのは安全ですか?
- 10. C++での構造体オフセットとポインタの安全性
- 11. C#プロジェクトとC#プロジェクト間でポインタを渡すと、C#プロジェクトで安全でない場合があります。
- 12. サーバにPHP 5があると想定するのは安全ですか?
- 13. プログラマチックにフラグメントビューにアクセスするのはいつ安全でしょうか
- 14. 2Dレンダリングの安全でないC#とポインタ、良いか悪いですか?
- 15. C++ STLスタック:(ポップすることが安全である)
- 16. は、このようにキャストしても安全かどう思っポインタのポインタ
- 17. C/C++で識別子として `$`を使うのは安全ですか?
- 18. Objective-Cでカテゴリ定義のメソッドをオーバーライドすることは安全ですか?
- 19. マルチスレッドシングルライターマルチリーダコードでintを使用するのは安全です
- 20. のは、これが私のモデルであると仮定してみましょうprefetch_related
- 21. なぜポインタがポインタよりも安全ですか?
- 22. 安全なC#ではないC++、ポインタ/参照
- 23. これは安全ですか? (Objective Cのインスタンス変数へのポインタ)
- 24. intはポインタCでは
- 25. PHPでユーザ定義のパスが安全であることを確認する
- 26. Cの次のデータブロブへのポインタを反復することは安全ですか?
- 27. なぜポインタが同じサイズのCである
- 28. C++にIOCライブラリがあるのでしょうか?
- 29. C#でポインタ(安全でないコード)を使用する必要がありますか?
- 30. `int(numpy.sqrt(N))`の安全性
おそらくスタックオーバーフローの質問。 – Orbling
も参照してください:[C++:intへのポインタをキャストして後でポインタに戻っても安全ですか?](http://stackoverflow.com/questions/3567905/c-is-it-safe-to-cast-pointer- int-と-after-later-back-to-pointer-again) – Shog9
[sizeof(int)== sizeof(void \ *)?]の重複が可能です(http://stackoverflow.com/questions/502811/sizeof- int sizeof-void) – Amro