3

このコードスニペットに期待される動作は何ですか?

char * aNullPointer = 0;
snprintf (res, 128, "Testing %s null pointer",aNullPointer);

nullポインタを逆参照するように意図的に取得しようとしていることに注意してくださいaNullPointer

動作1)res文字列「Testing(null)nullpointer」を指している

動作2)セグメンテーション違反

プラットフォームによって動作が異なるようです。一部のsnprintf実装は健全性チェックを実行しますが、他の実装は実行しません。

最も一般的な動作は何ですか?

4

5 に答える 5

8

これは未定義の動作です。期待することは何もありません。一部の実装がそれをチェックしNULLて「nil」または「null」に置き換えるという事実は単なる良い点であり、まったく信頼することはできません。

于 2012-09-07T11:01:03.970 に答える
2

未定義の動作。しないでください。

glibcは(null)NULLポインターを渡すときに使用します%sが、この機能に依存しないでください。

于 2012-09-07T11:01:37.560 に答える
1

ある意味、期待される動作はありません。実際、動作は非常に広い意味で未定義であると標準で明示的に規定されています。動作、セグメンテーション違反、ハードドライブのフォーマットなどが可能ですNULL。ポインタを自分で確認する必要があります。

于 2012-09-07T11:02:40.360 に答える
1

ここでの他の答えに対する1つの注意点:2番目の引数(書き込むバイト数を指定する)がゼロの場合、最初の引数としてnullポインターを渡すことができます。snprintf

C11標準(強調鉱山)から:

この関数は、出力がストリームではなく配列(引数で指定)に書き込まれることを除いて、snprintfと同等です。がゼロの場合、何も書き込まれず、sはnullポインタである可能性があります。fprintfsn

これは、 https://stackoverflow.com/a/10388547/1709587に示すように、snprintfへの2回目の呼び出しで書き込むサイズのバッファを割り当てるために、最初に書き込みたいバイト数を見つけるのに役立ちます。snprintf

ただし、がゼロ以外の場合n、動作は定義されていません。

于 2019-08-25T13:11:05.317 に答える
0

Opengroupの仕様を考慮すると、この場合の動作は定義されていないようです。

引数は、charの配列へのポインタでなければなりません。配列からのバイトは、終了するヌルバイトまで書き込まれます(ただし、含まれません)。精度が指定されている場合は、そのバイト数を超えて書き込まれることはありません。精度が指定されていないか、配列のサイズより大きい場合、アプリケーションは配列にヌルバイトが含まれていることを確認する必要があります。

于 2012-09-07T11:06:44.607 に答える