关于char*和数组字符串之间的字符串比较差异的说明

Ede*_*nia 2 c arrays string pointers

好吧,我以为我知道关于指针和内存操作的一切,但有一点让我好奇.strcmp到目前为止,我一直在比较字符串,但..

这个表达是正确的:

#include <stdio.h>

int main()
{
    char* str1 = "I love StackOverflow"; // dram memory alocated
    char* str2 = "I love StackOverflow";

    if(str1 == str2) printf("%s and %s are equal", str1, str2);
    else printf("%s and %s are not equal", str1, str2);

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

哪个应该在str1和str2的每个内存块之间进行比较?在这种情况下..如果我们使用:

char str1[] = "I love StackOverflow"; // saving them on stack
char str2[] = "I love StackOverflow";
Run Code Online (Sandbox Code Playgroud)

相反,它不会输出它们是相等的.为什么?

oua*_*uah 5

在第一个例子中,绝对不能保证两个指针是相等的.它是由编译器利用字符串文字在C中不可变的事实执行的优化.

C99理由文件说:

"此规范允许实现共享具有相同文本的字符串副本,将字符串文字放在只读内存中,并执行某些优化"

您不应该依赖于此,如果您想比较字符串,请在第一个或第二个代码段中使用strcmp/ strncmpfunctions.