これは予想される結果です。これは、基になるアセンブリを調べることで確認できます。たとえば、次のようにビルドすると:
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
2 つの重要なビットについてコメントしました。'Hello' の出現は、基になるコードの rdata セクションに 1 つだけあり、str1 と str2 が最後に設定されており、両方とも同じラベルを指していることがわかります: LC0
. これは、「Hello」が文字列リテラルであり、重要なことに定数であるためです。
他の人が指摘しているように、これは基準の下では完全に合法です。