C字符串与等号的比较

Geo*_*nos 6 c string c-strings

我有这个代码:

char *name = "George"

if(name == "George")
   printf("It's George")
Run Code Online (Sandbox Code Playgroud)

我认为c字符串无法与==sign 进行比较,我必须使用strcmp.由于未知原因,当我使用gcc(版本4.7.3)编译时,此代码有效.我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,比较==不能做.那么为什么这种比较方法有效?

小智 27

我认为c字符串无法与==符号进行比较,我必须使用strcmp

对.

我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,与==比较无法完成

那也是对的.

那么为什么这种比较方法有效?

它不"有效".它似乎只是起作用.

发生这种情况的原因可能是编译器优化:两个字符串文字是相同的,因此编译器实际上只生成它们的一个实例,并且每当引用字符串文字时使用相同的指针/数组.


Yu *_*Hao 9

只是提供@ H2CO3答案的参考:

C11 6.4.5 字符串文字

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

这意味着在您的示例中,name(字符串文字"George")并且"George"可能也可能不共享相同的位置,这取决于实现.所以不要指望这一点,它可能会在其他机器上产生不同的结果.

  • 这真的很有帮助,+ 1. (3认同)

caf*_*caf 5

您所做的比较会比较两个字符串的位置,而不是它们的内容.只是碰巧你的编译器决定只创建一个包含字符的字符串文字"George".这意味着存储在其中的字符串name的位置和第二个的位置"George"是相同的,因此比较返回非零.

然而,编译器不需要执行此操作 - 它可以轻松地创建两个不同的字符串文字,具有不同的位置但内容相同,然后比较将返回零.