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

时间:2013-04-23 06:15:01

标签: 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; 
}

4 个答案:

答案 0 :(得分:13)

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

C++11, 6.4.5 String literals /6州:

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。

str1str2都是指向包含四个字符{ 'x', 'y', 'z', '\0'}的内存块的指针,根据定义,它们是不可修改的。

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

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

答案 1 :(得分:1)

“xyz”是一个字符串文字,放入“只读”部分,以只读方式映射到进程空间(这就是为什么你不能改变它)。

因此str1str2都指向同一地址。这就是printf("Same!\n");被执行的原因。

这取决于平台。请参阅String literals: Where do they go?

答案 2 :(得分:0)

C不支持字符串比较运算符,因此在使用==运算符比较字符串时,它实际上会比较字符串地址,因为没有定义“xyz”字符串常量在只读存储器中具有相同的内存地址。它取决于编译器和机器。

答案 3 :(得分:0)

可能它未定义,因为它取决于编译器如何优化字符串。如果不知道使用什么选项的编译器,通常无法定义结果。