将字符数组与C中的==运算符进行比较

And*_*ech 4 c arrays string-comparison

我知道在C中比较"字符串"的正确方法是使用strcmp,但现在我尝试将一些字符数组与==运算符进行比较,并得到一些奇怪的结果.

看看下面的代码:

int main()
{
    char *s1 = "Andreas";
    char *s2 = "Andreas";

    char s3[] = "Andreas";
    char s4[] = "Andreas";

    char *s5 = "Hello";

    printf("%d\n", s1 == s2); //1
    printf("%d\n", s3 == s4); //0
    printf("%d\n", s1 == s5); //0
}
Run Code Online (Sandbox Code Playgroud)

第一个printf正确打印a 1,表示它们不相等.但有人可以向我解释为什么,在比较字符数组时,==返回的是0

有人可以向我解释为什么第一个printf返回a 1(即,它们相等)并且字符数组返回一个0

Mar*_*ett 20

==正在比较内存地址.
您的编译器可能正在使s1和s2指向相同的静态数据以节省空间.

即.前两行代码中的"Andreas"存储在您的可执行数据中.C标准说这些字符串是常量的,因此将两个指针指向同一存储器.

char []行通过将数据复制到变量中来创建变量,因此在执行期间存储在堆栈上的不同地址.

  • 我很确定标准要求同一翻译单元("文件",标准说法)中的相同字符串文字**需要**才能拥有相同的存储位置. (2认同)
  • Andy:不是必需的,6.4.5/6(C99):"这些阵列是否明显不明确......" (2认同)