2009-04-13 100 views

答えて

11

これは完全に実装に依存します。

これはハードウェアによって異なりますが、コンパイラの年齢によっても異なります。合理的に現代的なコンパイラ(90年代初頭以降の標準に基づく何かを意味する)を持つ人にとっては、size引数はsize_tです。コンパイラがコンパイルするメモリモデルに応じて、最大16ビットの符号なし、最大の32ビットの符号なし、または最大64ビットの符号なしとすることができます。この場合、あなたの実装にはどれくらいのサイズのsize_tがあるかを調べるだけです。ただし、非常に古いコンパイラ(つまり、ANSI-Cおよびperhaps for some early versions of ANSI Cの前)では、すべてのベットがオフです。

例えば、標準の側では、cygwinとSolaris 7を見ると、size引数はsize_tです。私が利用できる組み込みシステムを見ると、size引数はunsigned(16ビットの符号なしを意味する)です。 (この組み込みシステム用のコンパイラは80年代に書かれました)ANSI C where the size parameter is an intのWeb参照が見つかりました。

あなたはsize_tが誤って署名されたいくつかの初期のGCCのバージョンの誤機能についてsize_tthis articleなどfollow-up articleを見てみたいことがあります。要約すると

は、ほぼ全員ため、size_tは、使用する正しい参照となります。しかし、非常に古いコンパイラを使用している組み込みシステムやレガシーシステムを使用しているシステムでは、マニュアルページを確認する必要があります。

+0

誰もが、これをあまり標準化していないときに、C言語でプログラミングするには十分ではなかったはずです。 – Eddie

+0

C89以前のコンパイラは依然として共通ですか?レガシーシステムでの作業を除いて、size_tに依存するのはかなり安全だと思います。 –

+0

私はあなたがこのsize_tのことはよく標準化されていないと言われていたので、私は落ちました。 –

0

これらはsize_t引数をとります。プラットフォームに依存しています。

0

実装に依存しますが、memcpyを使用する前にインクルードする必要があるヘッダー(.h)ファイルを見ることができます。宣言があなたに伝えます(size_tか他のものを探す)。

そして、あなたはsize_tがどのようなものかを尋ねる、それは実装依存の部分です。

1

関数は通常、パラメータとしてサイズを渡すためにsize_tを使用します。 fgets()intというパラメータを使用しているので、私は普通に言っています。これは私の意見ではC標準の欠陥です。

size_tは、アクセス可能なオブジェクトのサイズ(バイト単位)を含むことができるタイプとして定義されています。一般的にはunsigned intまたはunsigned longのtypedefです。
だから、sizeof演算子による戻り値はsize_tタイプです。

So 2 **(sizeof(size_t) * CHAR_BIT)は、プログラムで処理できる最大量のメモリを提供しますが、確かに最も正確なメモリではありません。
CHAR_BITlimits.hで定義され、charに含まれるビット数を生成します)。

+0

CHAR_BITは8に定義されていませんか?または、charは1バイトにのみ定義されていますか? –

+0

char = 1バイト、ビット数が変更される可能性があります – aib

+0

標準を引用すると、CHAR_BITは「ビットフィールド(バイト)ではない最小オブジェクトのビット数」であり、少なくとも8でなければなりません。リンク:http://c-faq.com/charstring/wchar.html。 –

0

右、2 ^(sizeof(size_t)* 8)バイトを超える領域はコピーできません。しかし、これは心配するものではありません。なぜなら、mallocもsize_tパラメータとしてサイズを取るため、スペースをさらに割り当てることができないからです。

+0

"2 ^(sizeof(size_t)* 8)"と思っています。 –

+0

よくmalloc()を複数回呼び出すことができます:) – aib

+0

@aibもちろん、連続したバッファは保証されません。 –

0

また、size_tが、あなたのプラットフォームでプロセスが実際に処理することができるものを表すことができる問題に関連しています。

64ビットプラットフォームの仮想メモリであっても、今週は数TB以上のサイズのmemcpy()を呼び出すことはできませんが、それでもかなりホットなマシンです。完全にカバーされた64ビットのアドレス空間をインストールすることが可能なマシンがどのようなものかは想像がつきません。

size_tの定義にかかわらず、RAMよりも多くの情報をmemcpy()より多く試すのは意味がありません。あなたがした場合、その呼び出しから返信アドレスを保持しているスタックにちょうど何が起こったのか考えますか?

またはプロセスによって認識される仮想アドレス空間が、インストールされている物理メモリよりも小さいシステム。これは実際にはWin64プラットフォーム上で実行されるWin32プロセスの場合です。 (私は最初に、4MBの物理メモリと64KBの仮想アドレスを持つPDP-11上で動作するOS TSX-11を共有する時に遭遇した.4MBのRAMは多くのメモリを消費していた。 )

関連する問題