【问题标题】:Identical string literals are considered equal? [duplicate]相同的字符串文字被认为是相等的吗? [复制]
【发布时间】:2014-09-19 07:25:15
【问题描述】:

我编写了以下程序:

#include <stdio.h>

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

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

以前,我做过相同类型的示例(一年前),当时输出“不相等”。现在,谁能告诉我,这是由于 C 标准的变化,还是我遗漏了什么?

【问题讨论】:

  • 比较字符串使用strcmp().
  • 没有什么可以阻止编译器使用相同的地址进行优化,因为这里的字符串文字是 const。
  • 为什么有人会做这样的事情?
  • @AlexisKing 这个问题问为什么它是平等的,而不是相反。所以从技术上讲,我认为不是重复的,尽管相同的答案可以回答这两个问题。
  • @YuHao 这个问题的答案确实回答了这个问题,提到编译器可能生成导致相等的代码,但它并不需要以一种或另一种方式C 标准。

标签: c


【解决方案1】:

未指定具有相同内容的字符串文字是否具有相同的地址。所以你的程序的输出可能是equal,也可能是not equal,你的编译器恰好把它们放在了同一个地方。

C11 6.4.5 字符串字面量

如果这些数组的元素具有 适当的值。

【讨论】:

    【解决方案2】:

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

    所以,我认为这是一个编译器翻译/优化,它在内存中的同一位置“映射”相同的文字。

    编辑 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
    

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

    【讨论】:

    • ,我已经删除了优化(cc -O0 prog.c,我想那里还有一些优化)然后编译器也只将相同的字符串文字存储在一个内存位置。谢谢
    【解决方案3】:

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

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

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

    即使是只读存储器,你也只是用来比较而已。你没有修改,也没有写任何东西。

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多