c - 不同的字符串如何具有相同的地址

标签 c string pointers memory

我知道为了在 C 中比较两个字符串,你需要使用 strcmp() 函数。 但我试图用 == 运算符比较两个字符串,它起作用了。我不知道怎么做,因为它只是比较两个字符串的地址。如果字符串不同,它不应该工作。但后来我打印了字符串的地址:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* str1 = "First";
    char* str2 = "Second";
    char* str3 = "First";

    printf("%p %p %p", str1, str2, str3);

    return 0;
}

输出是:

00403024 0040302A 00403024
Process returned 0 (0x0)   execution time : 0.109 s
Press any key to continue.

str1str3 怎么可能有相同的地址呢?它们可能包含相同的字符串,但它们不是相同的变量。

最佳答案

不能保证它会一直这样。通常,实现者维护一个文字池,只维护每个字符串文字一次,然后对于字符串文字的多次使用,使用相同的地址。但人们可能会以不同的方式实现它——标准对此没有任何限制。

现在您的问题是:您正在查看指向同一字符串文字的两个指针的内容。相同的字符串文字产生相同的值(它们衰减为指向第一个元素的指针)。但是由于第一段所述的原因,该地址是相同的。

另外,我会强调为 %p 格式说明符的参数提供 (void*) 类型转换。

关于c - 不同的字符串如何具有相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135761/

相关文章:

c - 多精度加法实现

c++ - 在整个网络中广播自己的IP

c - 尝试通过指针数组从 2D 数组打印字符串时出现段错误

c - 为什么在 C 中将指针的地址传递给函数

c++ - 使用指针替换cpp中字符串中的字符

c - 使用 AES-256 加密和解密

c - 是否可以使用共享对象构造函数来设置库搜索路径?

c++ - 如何将 std::string_view 转换为 const char*?

string - 对 JavafX 中单个 TextArea 中的字符串应用不同的样式

c - 显示来自正在传递的 Struct 的数据