temp ....sprintfまたはsnprintfの呼び出しで誤って使用されています。
sprintf()またはsnprintf()の呼び出しの結果としてオーバーラップするオブジェクト間でコピーが行われる場合、結果は未定義です。
temp ....sprintfまたはsnprintfの呼び出しで誤って使用されています。
sprintf()またはsnprintf()の呼び出しの結果としてオーバーラップするオブジェクト間でコピーが行われる場合、結果は未定義です。
これは、次の場合でも、gccからの警告を引き起こしません-Wall -Wextra -pedantic
。
#include "stdio.h"
int main (void) {
char xx[1000] = "hello";
sprintf (xx, "xyzzy plugh %s", xx);
printf ("%s\n", xx);
return 0;
}
ただし、これが悪い考えと見なされる理由は、出力からわかります。取得するのではなく:
xyzzy plugh hello
普通の人が期待するかもしれないように、あなたは実際に以下を得る:
xyzzy plugh xyzzy plugh
ただし、すべての未定義の動作と同様に、マイレージは異なる場合があります。
決定的なリファレンスは、C99標準のセクション7.19.6.6 The sprintf function
であり、次のように述べられています。
sprintf関数はfprintfと同等ですが、出力がストリームではなく配列(引数sで指定)に書き込まれる点が異なります。書き込まれた文字の最後にヌル文字が書き込まれます。戻り値の一部としてはカウントされません。オーバーラップするオブジェクト間でコピーが行われる場合、動作は定義されていません。
C ++標準(実際にはC ++ 0xドラフトですが、いつの日か確実にリリースされる予定です。できれば、皆さん、入手してください)は、C標準の一部を非推奨の機能として組み込んでいるため、これを参照しています。