10 進整数フォーマット (%d、%u、%ld、%lld) に printf または fprintf を使用する場合、指定された形式がフォーマットされるデータ型と一致していることを確認することが重要です。そうしないと、未定義の動作が発生する可能性があります。
プログラミングで未定義の動作を定義することは、次のような広範囲にわたる考えられる結果を含むため、困難です。
次のコード スニペットを考えてみましょう:
#include <stdio.h> int main() { long a = 10; long b = 20; printf("%d, %d\n", a, b); }
32 ビット アーキテクチャでは、結果は予想どおり「10, 20」になります。ただし、64 ビット アーキテクチャでは、出力は "10, 2097152" に変わります。
この異常は、printf が '%d' 形式指定子を int 型のプレースホルダーとして解釈するためです。これは、アーキテクチャでは 32 ビットです。 32 ビット アーキテクチャ。しかし、64 ビット アーキテクチャでは int は 64 ビットであるため、long 値の変換が正しく行われません。
間違った形式文字列を使用すると、重大な結果が生じる可能性があります。
以上がprintf/fprintf の間違ったフォーマット文字列が未定義の動作を引き起こす可能性があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。