Questo è un risultato previsto. È possibile verificare ciò osservando l'assembly sottostante. Per esempio, se io costruisco con:
g++ -S ptr.c
allora si può vedere quanto segue nel file di output (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
Ho commentato le due bit della chiave - una sola l'aspetto di "Ciao" si trova nella sezione rdata del codice sottostante, e puoi vedere che str1 e str2 sono impostati verso la fine, entrambi puntati alla stessa etichetta: LC0
. Questo è perché "Hello" è una stringa letterale e, soprattutto, è costante.
Come altri hanno sottolineato, questo è perfettamente legale secondo gli standard.
fonte
2012-11-22 15:58:41
Hai disattivato le ottimizzazioni? –
"e stanno puntando a diverse posizioni di memoria" ... beh, risulta che in realtà stanno puntando alla stessa posizione. Questo è permesso. –
Le due backquote nel codice sorgente dovrebbero impedirne la compilazione (e con un compilatore C++ 11 conforme, la mancanza di 'const' dovrebbe impedirne la compilazione). –