2

C 文字列ライブラリの strlen 関数を使用しています。NULL 文字列を渡したところ、不思議な結果が見つかりました。NULL 文字列を渡すことになっていないことはわかっていますが、説明が必要です。コードは次のようになります。

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

私のgccコンパイラでは、コメントで問題なく動作します。ただし、行のコメントを削除する場合 k=strlen(s);

セグメンテーション違反が発生します。説明はありますか?

4

3 に答える 3

3

null ポインターを渡すとstrlen未定義の動作が発生します。 なんでも起こる可能性がある。 セグフォルトを含む。また、セグフォルトは含まれていません。

正確な理由を知りたい場合は、コンパイラが生成するアセンブラ コードを調べる必要があります。しかし、これは有益なことは何も教えてくれません。

于 2011-06-16T10:37:06.933 に答える
3

戻り値を割り当てていない最初の「strlen」呼び出しは、コンパイラによって最適化されている可能性があります。

于 2011-06-16T10:38:01.923 に答える
1

これは int 変数への代入を行わないアセンブラ コードです。

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

値が使用されないため、コンパイラは _strlen を呼び出しません。

于 2011-06-16T10:48:29.057 に答える