Your questions has been tagged C as well as C++. So I'd answer for both the languages.
[C]
From ISO C99 (Section 6.4.5/6
)
It is unspeci?ed whether these arrays are distinct provided their elements have the appropriate values.
That means it is unspecified
whether p
and q
are pointing to the same string literal or not. In case of gcc
they both are pointing to "I am a string"
(gcc optimizes your code) whereas in turbo c
they are not.
Unspeci?ed Behavior:
Use of an unspeci?ed value, or other behavior where this International Standard provides
two or more possibilities and imposes no further requirements on which is chosen in any
instance
[C++]
From ISO C++-98 (Section 2.13.4/2
)
Whether all string literals are distinct(that is, are stored in non overlapping objects) is implementation defined.
In C++ your code invokes Implementation defined behaviour.
Implementation-de?ned Behavior:
Unspeci?ed Behavior where each implementation documents
how the choice is made
Also see this question.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…