这是预期的结果。您可以通过查看底层程序集来验证这一点。例如,如果我构建:
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
我已经注释了两个关键位——在底层代码的 rdata 部分中只有一个“Hello”出现,您可以看到 str1 和 str2 设置在最后,都指向同一个标签:LC0
。这是因为 'Hello' 是字符串文字,重要的是,它是常量。
正如其他人所指出的 - 根据标准,这是完全合法的。