代码之家  ›  专栏  ›  技术社区  ›  unalignedmemoryaccess

比较相同的字符串文字是否总是正确的?[重复]

  •  0
  • unalignedmemoryaccess  · 技术社区  · 7 年前

    在C语言中,编译器/链接器是否有义务将 字符串文字 在单个内存位置多次使用?

    const char* a = "abcdef";
    const char* b = "abcdef";
    
    //Compare pointers
    if (a == b) {
        printf("True\r\n");
    } else {
        printf("False\r\n");
    }
    

    在这种情况下,上述陈述是否总是正确的(在MSVC 2017中是),还是正确的 未定义的行为 一般来说

    我们有字符串文字吗 abcdef 在里面 2 不同的存储位置?当然,我不会像这样计算字符串 12abcdefgh ˛在哪里 abcdef 是字符串的一部分,但独立。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Eugene Sh.    7 年前

    你在这里比较的是 指针 到字符串文本。字符串文本静态地分配在一些不应该写入的内存中。优化编译器 可以 只分配同一个字符串文本一次,因为它假设这些字符串永远不会更改,并且没有必要拥有多个副本,这就是您在这里看到的。但这并不能保证。

        2
  •  1
  •   user3386109    7 年前

    这是未指明的行为,但大多数编译器会对此进行优化,使其成为事实。如果您正在为特定的编译器编码,您可能会发现一个开关或 #pragma 它控制着这些线的折叠,因此给你一些确定性的东西。