Ceci est un résultat attendu. Vous pouvez vérifier cela en regardant l'assemblage sous-jacent. Par exemple, si je construis avec:
g++ -S ptr.c
alors vous pouvez voir ce qui suit dans la sortie de fichier (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
J'ai commenté les deux bits clés - une seule l'apparence de 'Hello' se trouve dans la section rdata du code sous-jacent, et vous pouvez voir que str1 et str2 sont placés vers la fin, tous deux pointant vers la même étiquette: LC0
. C'est beacuse 'Bonjour' est un littéral de chaîne et, surtout, est constante.
Comme d'autres l'ont souligné - cela est parfaitement légal selon les normes.
Avez-vous désactivé les optimisations? –
"et ils pointent vers différents emplacements de mémoire" ... eh bien, il se trouve qu'ils pointent vers le même emplacement. Ceci est autorisé –
Les deux backquotes dans le code source devraient l'empêcher de compiler (et avec un compilateur C++ 11 conforme l'absence de 'const' devrait l'empêcher de compiler). –