这是预期的结果。您可以通过查看底层程序集来验证这一点。例如,如果我建立与:
g++ -S ptr.c
,那么你可以看到在文件输出以下(ptr.s):
.file "ptr.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "Hello\0" ; Note - "Hello" only appears once in
; this data section!
LC1:
.ascii "=\0"
LC2:
.ascii "!=\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
[... some stuff deleted for brevity ...]
LCFI5:
call ___main
movl $LC0, -12(%ebp) ; This sets str1
movl $LC0, -8(%ebp) ; This sets str2
movl -12(%ebp), %eax
我评论的两个关键位 - 仅一个'Hello'的外观出现在底层代码的rdata部分,您可以看到str1和str2设置在最后,都指向相同的标签:LC0
。这很重要'你好'是一个字符串文字,重要的是常量。
正如其他人所指出的 - 在标准下这是完全合法的。
您是否关闭优化? –
“,他们指向不同的记忆位置”......好,事实证明,他们实际上指向相同的位置。这是允许的。 –
源代码中的两个反引号应该防止它编译(并且符合C++ 11编译器缺乏'const'应该防止它编译)。 –