为什么在C中未定义此代码的行为?

Nim*_*iri 2 c undefined-behavior

我已经得到了这个代码,我不太确定为什么它的行为是未定义的.我的猜测是它与两个字符串的内存位置和if条件中的位置比较有关.

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

  if (str1 == str2) {
     printf("Same!\n");
  }  else {
     printf("Not Same!\n");
  }
  return 0; 
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 13

关于是否折叠相同的字符串常量以占用相同的内存,未指定(未定义,有一个细微的区别).

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

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

两个str1和str2是包含4个字符指针的存储器的块{ 'x', 'y', 'z', '\0'}和它们根据定义,不可修改的.

这意味着编译器可以自由地将这两个变量设置为指向相同的内存块,以提高效率,如果需要的话.

因此str1,str2(我正在谈论指针,显然指针背后的内容是相同的)可能相同或不相同.