2013-05-03 4 views
12

特に、以下は明確に定義されているか、または未定義の動作を示していますか?memcmpにヌルポインタを渡すことはできますか?

memcmp(0, 0, 0); 

CとC++の違いはありますか?理想的には、標準から引用符を入力してください。

+0

これは実行されますか?あなたはNULLからメモリを読み込みますが、私はそれがうまくいくかどうかわかりません。 – Eric

+2

閉じるボタンを押すのが早すぎます。これは 'memcpy'ではなく、' memcmp'に関するものです。再投票する投票。 –

+3

@Eric 'count'パラメータが' 0'の場合、ポインタは逆参照されるべきではありません。しかし、言われていることは、標準がこの行動を保証しているかどうかを質問します。私はその答えを知らないのです。 – Praetorian

答えて

30

具体的には、次のように明確に定義されているか、または未定義の動作を示していますか?

未定義です。 C99 7.21.1/2は、すべての文字列関数について述べている:

明示的にこの節で特定の機能の説明で特に を明記しない限り、ポインタ引数は、コールの がまだ有効な値

を持たなければなりません

と、7.21.4.1のmemcmpの説明には、特に明記されていません。

CとC++の違いはありますか?

いいえ、C++はCライブラリ関数の定義のためにCに委ねられていますが、特別なことについてはmemcmpについては言及していません。

+0

2番目の引用符の関連性は、先頭のコンテキストによって明確になります。 'size_t nで宣言された引数が関数の配列の長さを指定する場合、nはその関数の呼び出しで値0を持つことができます。他に明記されていない限り... – user295691

+0

受け入れていただきありがとうございます。しかしもう1つの質問:ポインタの "有効な値"は本当に "非null"を意味しますか?その旨の引用がありますか? – avakar

+2

@avakar:もしあなたが本当に苦い終わりまで標準を守りたいのであれば、引用符は "有効"の定義のために7.1.4を参照していて、特に "nullポインタ"を含むライブラリ関数の "無効な"値の例 –

関連する問題