あなたはと言いますが、それは動作しません、しかしあなたはそれが何かを言わない。この予期しない動作のための最も可能性の高い理由は次のとおりです。
int
値を期待%d
変換指定。 sizeof(int)
は、タイプがsize_t
であり、符号なしであり、多くのプラットフォームではint
より大きく、未定義の動作を引き起こします。
printf()
のようにvararg関数に異なる型が異なる型で渡されるため、渡された引数の型と変換指定子は一貫していなければなりません。 size_t
とprintf
を渡すと、int
が必要です。間違った場所から値が取得され、一致しないと出力が生成されます。
あなたがと言う場合は、%ld
と入力すれば動作します。 size_t
は、ご使用のプラットフォームでlong
と同じサイズになることがありますが、これは偶然であり、64ビットWindowsではsize_t
がlong
より大きいためです。
問題を修正するには、あなたのいずれかを行うことができます
- は、標準の変換指定子を使用し
%zu
か
- は
int
として値をキャスト。
最初のものは正しい修正ですが、一部のCライブラリでは%zu
をサポートしていません。特に、VS2013より前のMicrosoft Cランタイムライブラリが最も重要です。したがって、私はより多くのポータブルと明らかに小さいサイズを持っているタイプとオブジェクトのために十分である第2のをお勧めします。
#include <stdio.h>
int main(void) {
printf("%d\n", (int)sizeof(int));
printf("%d\n", (int)sizeof(float));
printf("%d\n", (int)sizeof(double));
printf("%d\n", (int)sizeof(char));
return 0;
}
はまた、あなたは出力改行をしないことに注意してください:環境によっては、出力が表示されません改行が出力されるか、fflush(stdout)
が呼び出されるまでユーザーを呼び出します。プログラム終了時に出力がコンソールにフラッシュされず、観察された動作を引き起こす可能性もありますが、そのような環境は珍しいことです。意味のある出力の最後に改行を出力することをお勧めします。あなたのケースではそうしないと、すべてのサイズが4481
のような一連の数字としてまとまってしまうことがあります。
どのコンパイラ/プラットフォームですか?私はそれがほとんどの場合にうまくいくと思います。 'printf("%d \ n "、sizeof ...);' – i486
"これはうまくいきません"のように '%d 'の後に' \ n'を追加する方が良いです。まさに、どうやって動かないのですか?問題を再現するための手順を示してください。 – jdv
コンパイルエラーが出ていましたが、%zuの回答があります! –