在C中打印字符串的地址是否有效

Sta*_*kIT 15 c arrays string

我有两个问题......(我正在学习C,这可能是个愚蠢的问题.道歉)

我的问题是,无论如何要声明一个字符串?

放在只读区域,然后复制到数组.在C中打印字符串的地址是否有效?

printf("%p\n", &"Hello There"); // I tried, it prints some address
Run Code Online (Sandbox Code Playgroud)

并通过这样做

printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");
Run Code Online (Sandbox Code Playgroud)

它正在打印相同的地址.感觉是什么,它应该打印不同的地址.编译器在这里进行一些优化吗?

Fre*_*Foo 14

C标准,§6.4.5字符串文字,说:

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.

因此,具有相同内容的两个字符串文字可以表示相同的数组,并且打印它们的地址会给出相同的指针值两次.由编译器和链接器决定这一点; 当我将以下程序编译为两个独立的模块时......

// main.c
#include <stdio.h>

extern void print_foo_addr(void);

int main()
{
    printf("%p\n", &"foo");
    print_foo_addr();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

// printfoo.c
#include <stdio.h>

void print_foo_addr()
{
    printf("%p\n", &"foo");
}
Run Code Online (Sandbox Code Playgroud)

...然后我得到两个不同的指针值(Linux上的GCC 4.7.3),但是当我把定义输入print_foo_addrmain.c,我得到两次相同的值.所以,是的,这是标准明确允许的优化,但GCC至少只在每个模块的基础上执行此优化.