2

C:
文字列長関数が値を返していsize_tますか?

従来の整数を返さないのはなぜですか? もう 1 つ気づいたことは、この文字列を別の文字列と連結しようとしたときに、プログラムを実行したときにバス エラーが発生したことです。

コンテキスト: gmp ライブラリをいじって大きな数字を文字列に変換していたところ、上記の状況になってしまいました。

それはどんな弦ですか?使用しているオペレーティング システムがこの問題に関与していますか? MAC、64 ビット OS を使用しています。

編集済み:受け取ったエラーメッセージは次のとおりです。

: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘size_t’

ありがとう!

@all:回答ありがとうございますが、別の問題のように見えるため、バスエラーを別の質問にすると思いました。

4

6 に答える 6

6

問題はint、可能な長さの値の全範囲を格納するのに十分な幅がない可能性があることです。たとえば、64 ビットでは 4 ギガバイトを超える文字列を持つことができ、 32 ビットの場合、変数intを介してそのような長い文字列の長さを返すことはできません。int

于 2011-04-19T13:05:24.363 に答える
3

strlen()常に返さsize_tれます...そしてPOSIX標準もそう言っています。

その理由は、int記号がありunsigned int、要素のサイズを保持するには容量が十分でない可能性があるためだと思います(たとえば、16GBのRAMを搭載したx86-64で32ビット整数を使用している場合)...例は極端ですが、可能です。

于 2011-04-19T13:11:51.553 に答える
3

POSIXstrlen() は戻りsize_tます。

バス エラーの原因については、コードを見て、変更の正確な性質に関する詳細を知らなければ、何とも言えません。可能性の 1 つは、バッファー オーバーランを引き起こしたか、ポインターで何かしてNULLはならないことをしたことです。

于 2011-04-19T13:05:05.957 に答える
2

警告 (実際にはエラーです - に間違った型を渡して未定義の動作を引き起こしました) に対処するには、値を出力するのではなく、をprintf使用する必要があります。%zu%dsize_t

于 2011-04-19T13:33:09.017 に答える
2

strlen()size_tは少なくとも ISO C90 以降を返します-- コピーをチェックインしたところです。そして、この規格は ANSI C89 と技術的な違いはないはずです。

規約が変更されましたが ( size_tK&R C にはありませんでした)、それはずっと前のことです。

于 2011-04-19T13:14:05.093 に答える
1

size_tメモリ ブロックの長さに関しては、標準ライブラリのすべての関数が動作する非常に単純で論理的な理由があります。組み込みsizeof演算子もsize_t結果を生成します。

さらに、署名されておらず、特定のサイズであり、アーキテクチャに関連付けられており、オフィス周辺の木の数から SO の評判までの任意の数を格納するためsize_tのジェネリックとは意味的に異なります。int

于 2011-04-19T13:49:48.757 に答える