実行可能ファイルのセグメントの名前を保持する16バイトの配列があります。
_char segname[16];
_
セグメント名の長さが16バイト未満の場合、残りはヌルバイトで埋められます。それ以外の場合、終端のヌルバイトはありません。
segname
をさまざまな文字列と比較したい___text
_。
strncmp
をnullで終了しない文字列で呼び出すことは合法ですか?
この投稿 は合法であると想定しています。 このソースコード はそれを合法にします。しかし、私の男のページは言う:
strncmp()
関数は、ヌル終了文字列_s1
_と_s2
_を辞書式に比較します。
strncmp
に渡されるサイズは、segname
のサイズになります。
私は何を参照すべきか疑問に思っています。
C99標準のセクション7.21.4.4、§3によると、それは合法です:
strncmp
関数は、ゼロよりも大きい、等しい、または小さい整数を返します。それに応じて、s1
が指すおそらくnullで終了する配列は、より大きい、等しいto、またはs2
が指すおそらくnullで終了する配列よりも小さい。
ただし、文字のarrayと表示されていることに注意してください。定義により、文字の配列がNULLで終了しない場合、それはnot文字列です。
Strncmp関数は、s1が指す配列とs2が指す配列とをn文字以下で比較します(ヌル文字に続く文字は比較されません)。
仕様7.24.4.2にはそれが記載されています。C11標準
Null文字に続かない文字は比較されないため、nullで終わる文字配列または文字列が期待されます。1
ここでもヌル以外の終端文字を使用できますが、その場合は、チェックするまでの長さを指定する必要があります。これは場合によっては便利です。
訂正
[1]Null文字の後に続かない文字が比較されないということは、strncmp
がnullで終わる文字列を期待しているという意味ではありません。これは、strncmp
が(たとえば)abc\0def
...およびabc\0xyz
...比較等しい。 指定された長さまで)nullで終了しない2つのchar配列の比較、またはnullで終了しないchar配列とnullで終了しないchar配列の比較に問題はありません
これはDavid Hammenのコメントから直接追加されます