C字符串的等号比较

C字符串的等号比较,c,string,c-strings,C,String,C Strings,我有以下代码: char *name = "George" if(name == "George") printf("It's George") 我认为c字符串不能与==符号进行比较,我必须使用strcmp。由于未知的原因,当我使用gcc(版本4.7.3)编译时,这段代码可以工作。我认为这是错误的,因为这就像比较指针一样,所以我在谷歌上搜索,很多人说这是错误的,与==进行比较是不可能的。那么为什么这种比较方法有效呢 这将失败,因为您正在比较两个单独字符串的两个不同指针。 如果此代码仍然

我有以下代码:

char *name = "George"

if(name == "George")
   printf("It's George")

我认为c字符串不能与
==
符号进行比较,我必须使用
strcmp
。由于未知的原因,当我使用gcc(版本4.7.3)编译时,这段代码可以工作。我认为这是错误的,因为这就像比较指针一样,所以我在谷歌上搜索,很多人说这是错误的,与
==
进行比较是不可能的。那么为什么这种比较方法有效呢

这将失败,因为您正在比较两个单独字符串的两个不同指针。 如果此代码仍然有效,那么这是对GCC进行大量优化的结果,只保留一个副本用于大小优化

使用strcmp()

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

我认为这是错误的,因为这就像比较指针一样,所以我在谷歌上搜索,很多人说这是错误的,与==进行比较是不可能的

那也对

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

它不“工作”。它似乎只起作用了


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

您所做的比较比较了两个字符串的位置,而不是他们的内容。碰巧编译器决定只创建一个包含字符
“George”
的字符串文本。这意味着存储在
name
中的字符串的位置与第二个
“George”
的位置相同,因此比较结果返回非零


然而,编译器不需要这样做-它可以很容易地创建两个不同的字符串文本,具有不同的位置但内容相同,然后比较结果将返回零。

只是为了提供对@H2CO3答案的引用:

C116.4.5字符串文字

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


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

如果您比较两个Sting,那么您是在比较这些字符串的基址,而不是这些字符串中的实际字符。要比较字符串,请使用
strcmp()
strcasecmp()
库函数或编写类似的程序。下面不是完整的代码,只是字符串比较所需的逻辑

void mystrcmp(const char *source,char *dest)
{
    for(i=0;source[i] != '\0';i++)
        dest[i] = source[i];
   dest[i] = 0;

}

使用strcmp(),您正在比较地址。您可以在这里检查。@nouney什么是UB?我看不出有什么理由。@H2CO3是的,没有理由,我的编译器愚弄了我。对于OP:,它会告诉你它为什么工作。OP只是说字符串结果是相等的。他也知道为什么要使用strcmp()。这不是答案。这也是错误的,因为“您正在比较两个单独字符串的两个不同指针”是不正确的——这正是我在回答中解释的原因。字符串是相等的,但它们放在两个不同的内存位置。因此,它们的指针不同,比较是错误的。如果这段代码仍然有效,那么这是对GCC进行大量优化的结果。“但是它们被放在两个不同的内存位置”-不,它们不是,我建议你最终阅读我的答案。@AndrejsCainikovs,因为它们是不可变的,可以放在一个地址中。这非常有用,+1.+1,GCC将把所有字符串文本放在.rodata节中,并且足够聪明,可以消除重复的字符串。:)在我看来,这更像是一个
mtystrcpy