相同的字符串文字被认为是相同的?

时间:2014-09-19 07:25:15

标签: c

我写了以下程序:

#include <stdio.h>

main()
{
    if("ddd" == "ddd")
        printf("equal");
    else
        printf("not equal");
}

输出是&#34;等于&#34;,但根据我的说法,输出应该是&#34;不等于&#34;因为字符串文字存储在文字池或某些只读存储器中(我猜它取决于操作系统),所以两个字符串应该有两个不同的地址,因为它们存储在内存中的不同地址。

以前,我做过相同类型的示例(一年前),那时输出是&#34;不等于&#34;。现在,有人可以告诉我,这是由于C标准的变化,还是我遗漏了什么?

3 个答案:

答案 0 :(得分:6)

对于具有相同内容且具有相同地址的字符串文字,未指定。因此,程序的输出可能是equal,也可能是not equal,您的编译器恰好将它们放在同一个地方。

  

C11 6.4.5字符串文字

     

如果这些数组的元素具有不同的数据,则未指定   适当的价值观。

答案 1 :(得分:5)

当然,你在这种情况下做的是指针之间的比较(使用strcmp来比较 C字符串)。

所以,我认为这是一个编译器翻译/优化&#34; maps&#34;内存中相同位置的相同文字。

编辑1:

以下示例确认了我写的内容:

#include <stdio.h>

char* a = "ddd";
char* b = "ddd";
char* c = "ddd";

int main() {
    printf ("a => %p\nb => %p\nc => %p\n", a, b, c);
}

使用gcc使用-O0编译并执行的上一个程序将打印:

a => 0x40060c
b => 0x40060c
c => 0x40060c

我不知道其他编译器会如何处理相同的情况。

答案 2 :(得分:1)

当您比较两个字符值(不是指针)时,它是一个数字比较。

但是当你比较两个字符串时,字符串的基地址会被比较。如果假设编译器认为两个字符串都在同一个位置,那么o / p是相等的。否则不是。

您正在比较不同字符串的两个内存地址,它们存储在不同的位置。所以,不等于。

即使它是只读存储器,您只能将其用于比较。您不会修改或不写任何内容。