我写了以下程序:
#include <stdio.h>
main()
{
if("ddd" == "ddd")
printf("equal");
else
printf("not equal");
}
输出是&#34;等于&#34;,但根据我的说法,输出应该是&#34;不等于&#34;因为字符串文字存储在文字池或某些只读存储器中(我猜它取决于操作系统),所以两个字符串应该有两个不同的地址,因为它们存储在内存中的不同地址。
以前,我做过相同类型的示例(一年前),那时输出是&#34;不等于&#34;。现在,有人可以告诉我,这是由于C标准的变化,还是我遗漏了什么?
答案 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是相等的。否则不是。
您正在比较不同字符串的两个内存地址,它们存储在不同的位置。所以,不等于。
即使它是只读存储器,您只能将其用于比较。您不会修改或不写任何内容。