Cstring与等号的比较

我有这个代码:

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

我认为cstring不能与==符号进行比较,我必须使用strcmp 。 当我使用gcc(版本4.7.3)进行编译时,出现不明原因,这段代码可以工作。 我虽然这是错的,因为它就像比较指针,所以我在谷歌search,许多人说这是错误的,并与==比较不能完成。 那么为什么这种比较方法有效?

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

对。

我虽然这是错的,因为它就像比较指针,所以我在谷歌search,许多人说这是错误的,并与==比较不能完成

那也是。

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

它不“工作”。 它似乎只是工作。

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

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

C11 6.4.5 string文字

没有说明这些数组是否是不同的,只要它们的元素具有适当的值。 如果程序试图修改这样一个数组,行为是不确定的。

这意味着在你的例子中, name (一个string“George”)和"George"可能并不共享相同的位置,这取决于实现。 所以不要指望这一点,在其他机器可能会有不同的结果。

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

不过编译器不需要这样做,但是它可以很容易地创build两个不同的string文字,不同的位置但内容相同,然后比较将返回零。

这将失败,因为你正在比较两个不同的string的两个不同的指针。 如果这个代码仍然有效,那么这是GCC的大量优化的结果,它只保留一个副本来优化大小。

使用strcmp() 。 链接 。

如果比较两个串,你比较这些string的基地址,而不是这些string中的实际字符。 用于比较string使用strcmp()strcasecmp()库函数或像这样写程序。 以下不是完整的代码只是string比较所需的逻辑。

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