2

私はこのコードを受け取りましたが、その動作が未定義である理由がよくわかりません。私の推測では、2 つの文字列のメモリの場所と、if 条件での場所の比較に関係があると思います。

int main(void) { 
  char *str1 = "xyz"; 
  char *str2 = "xyz";

  if (str1 == str2) {
     printf("Same!\n");
  }  else {
     printf("Not Same!\n");
  }
  return 0; 
}
4

4 に答える 4

13

同一の文字列定数が折りたたまれて同じメモリを占有するかどうかについては未定義です (未定義ではなく、微妙な違いがあります)。

C++11, 6.4.5 String literals /6状態:

これらの配列の要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。プログラムがそのような配列を変更しようとした場合、動作は未定義です。

str1とは両方ともstr2、4 つの文字を含むメモリ ブロックへのポインターで{ 'x', 'y', 'z', '\0'}あり、定義上、変更できません。

つまり、コンパイラは、必要に応じて、効率のためにこれらの変数を同じメモリ ブロックを指すように自由に設定できます。

したがってstr1、 and str2(ポインターについて話しているのですが、ポインターの背後にあるコンテンツは明らかに同一です) は、同一であるかどうかはわかりません。

于 2013-04-23T06:16:37.293 に答える
0

C は文字列比較演算子をサポートしていないため、== 演算子を使用して文字列を比較すると、実際には文字列アドレスが比較されます。また、「xyz」文字列定数が読み取り専用メモリで同じメモリ アドレスを持つことが定義されていないためです。コンパイラとマシンに依存します。

于 2013-04-23T06:20:33.547 に答える
0

コンパイラが文字列を最適化する方法に依存するため、おそらく未定義です。結果は、どのコンパイラとどのオプションが使用されているかを知らずに一般的に定義することはできません。

于 2013-04-23T06:23:15.097 に答える