打印两个具有相同值的字符串文字给出相同的地址

Printing two string literals with same value gives same address

谁能解释一下:

#include <stdio.h>

void some_fn(char *x)
{
    printf("%d\n", x);
}

int main()
{
    // They are stored on the same memory address
    some_fn("A");
    some_fn("A");

    some_fn("B");
}

为什么会:

    some_fn("A");
    some_fn("A");

打印存储在同一个内存地址?

首先,关闭使用 %d 打印指针(就像您在编辑之前在代码中最初使用的那样)是无效的,并且会导致未定义的行为。您应该改用 %p 指针。

也就是说,对 some_fn 的两次调用都被传递了一个字符串文字,每个字符串文字恰好相同。字符串文字通常存储在内存的只读部分,当特定字符串文字多次出现在代码中时,编译器通常会使用该文字的单个实例。所以在那种情况下,当它出现在不同的地方时,该文字的地址是相同的。