-2

temp ....sprintfまたはsnprintfの呼び出しで誤って使用されています。

sprintf()またはsnprintf()の呼び出しの結果としてオーバーラップするオブジェクト間でコピーが行われる場合、結果は未定義です。

4

1 に答える 1

1

これは、次の場合でも、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標準の一部を非推奨の機能として組み込んでいるため、これを参照しています。

于 2011-03-08T05:47:31.773 に答える