と同じGCC 4.8は私にエラーを与えているがgccのエラーがsnprintfエラーです。 sizeofの引数私はここで</p> <pre><code>#include <string.h> #include <stdio.h> static inline void toto(char str[3]) { snprintf(str, sizeof(str), "XX"); } int main(){ char str[3]; toto(str); return 0; } </code></pre> <p>を構築する際に、宛先
エラーです。「snprintfの」コールの「はsizeof」への引数があります宛先と同じ表現。あなたは明白な長さを提供することを意味しましたか?
注:警告をエラーに変換する-Wall -Werrorフラグを使用しています。コメントで
There is something similar here 、誰かが固定長バッファについて」
これに答え、私は通常はstrncpy(DEST、SRC、はsizeof(DEST))を使用します。DEST [はsizeof(DEST)-1] = ' \ 0 ';これはNULL終了を保証し、多くの人がsnprintf(dest、sizeof(dest)、src)を使用しているとは言えず、代わりにsnprintfよりも面倒でなく、プログラムが異常にクラッシュしたときに非常に驚いています。
しかし、これは間違っている: GCC 4.8は、「エラー
を言う。 『strncpyを』通話中 『はsizeof』への引数は、宛先と同じ表現であり、明示的な長さを提供するために意味しました[? -Werror =はsizeofポインタ-memaccess]」
in gcc 4.8 documentation, they are talking about this issue: 彼らは言う:
-Wallの動作が変更され、新しい警告フラグが含まれてい-Wsizeof-P ointer-memaccess。これにより、GCCの以前のバージョンと完全にコンパイルされたコードに新しい警告が出る可能性があります。例えば
、
include string.h
struct A { };
int main(void)
{
A obj;
A* p1 = &obj;
A p2[10];
memset(p1, 0, sizeof(p1)); // error
memset(p1, 0, sizeof(*p1)); // ok, dereferenced
memset(p2, 0, sizeof(p2)); // ok, array
return 0;
}
は、次の診断を提供します: 警告: 'はsizeof' に引数 '無効のmemset(void *型、int型、size_tの)' 呼び出しが同じ表現であるにし先;それを逆参照することを意味しましたか? [-Wsizeof-pointer-memaccess] memset(p1、0、sizeof(p1)); //エラー ^ これらの警告はコンパイルに失敗することはありませんが、-Werrorと一緒に-Wallが使用され、その結果新しい警告が新しいエラーに変わることがよくあります。 修正するには、memcpyを使用するように書き直すか、問題のあるmemset呼び出しの最後の引数を逆参照してください。*
この例では、なぜ、私はそれがgccの間違ったpositifエラーだと思います。右 ?あなたの助けのための
おかげ
奇妙なことに、 '-Wsizeof-pointer-memaccess'のドキュメントでは、最初の例で' char * str'を書いたときに警告すると思いますが、 'char str [3 ] '。 – hobbs
g ++で、私は何のエラーもありませんでした。 – PersianGulf
gcc 4.8.1では、警告を再現できませんでした。確かに 'char * str'ではなく' char str [3] 'を使っていますか? –