C's equality operator on converted pointers Announcing the arrival of Valued Associate #679:...

How to pronounce 伝統色

What is an "asse" in Elizabethan English?

How did Fremen produce and carry enough thumpers to use Sandworms as de facto Ubers?

How many time has Arya actually used Needle?

Is it fair for a professor to grade us on the possession of past papers?

Significance of Cersei's obsession with elephants?

Why weren't discrete x86 CPUs ever used in game hardware?

Drawing spherical mirrors

What to do with repeated rejections for phd position

Can a new player join a group only when a new campaign starts?

Would it be possible to dictate a bech32 address as a list of English words?

How to dry out epoxy resin faster than usual?

Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?

How does the math work when buying airline miles?

In musical terms, what properties are varied by the human voice to produce different words / syllables?

Movie where a circus ringmaster turns people into animals

How do living politicians protect their readily obtainable signatures from misuse?

How much damage would a cupful of neutron star matter do to the Earth?

What happened to Thoros of Myr's flaming sword?

How to draw/optimize this graph with tikz

Putting class ranking in CV, but against dept guidelines

How to write capital alpha?

Interpretation of R output from Cohen's Kappa

Do I really need to have a message in a novel to appeal to readers?



C's equality operator on converted pointers



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Casting integer constant to a pointer typeWhat are the differences between a pointer variable and a reference variable in C++?What is a smart pointer and when should I use one?How do function pointers in C work?What does the C ??!??! operator do?Why should I use a pointer rather than the object itself?How to determine if a pointer equals an element of an array?Comparing pointer values after conversion, still same equality?Equality comparison of pointers to different objectsCan an equality comparison of unrelated pointers evaluate to true?Identically-valued pointers comparing unequal





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







7















Coming from Casting integer constant to a pointer type



From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):




An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.




Then, from 6.5.9p6, we have:




Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.




So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:



struct A;

int f(void) {
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
}


Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.



How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?



All major compilers return true for the above code, as one would expect.










share|improve this question

























  • What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

    – Christian Gibbons
    2 hours ago













  • They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

    – St.Antario
    2 hours ago








  • 2





    @ChristianGibbons That refers to the null pointer constant case.

    – Acorn
    2 hours ago


















7















Coming from Casting integer constant to a pointer type



From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):




An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.




Then, from 6.5.9p6, we have:




Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.




So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:



struct A;

int f(void) {
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
}


Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.



How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?



All major compilers return true for the above code, as one would expect.










share|improve this question

























  • What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

    – Christian Gibbons
    2 hours ago













  • They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

    – St.Antario
    2 hours ago








  • 2





    @ChristianGibbons That refers to the null pointer constant case.

    – Acorn
    2 hours ago














7












7








7


3






Coming from Casting integer constant to a pointer type



From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):




An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.




Then, from 6.5.9p6, we have:




Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.




So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:



struct A;

int f(void) {
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
}


Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.



How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?



All major compilers return true for the above code, as one would expect.










share|improve this question
















Coming from Casting integer constant to a pointer type



From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):




An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.




Then, from 6.5.9p6, we have:




Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.




So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:



struct A;

int f(void) {
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
}


Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.



How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?



All major compilers return true for the above code, as one would expect.







c pointers language-lawyer






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 hours ago







Acorn

















asked 2 hours ago









AcornAcorn

6,70111441




6,70111441













  • What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

    – Christian Gibbons
    2 hours ago













  • They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

    – St.Antario
    2 hours ago








  • 2





    @ChristianGibbons That refers to the null pointer constant case.

    – Acorn
    2 hours ago



















  • What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

    – Christian Gibbons
    2 hours ago













  • They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

    – St.Antario
    2 hours ago








  • 2





    @ChristianGibbons That refers to the null pointer constant case.

    – Acorn
    2 hours ago

















What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

– Christian Gibbons
2 hours ago







What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?

– Christian Gibbons
2 hours ago















They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

– St.Antario
2 hours ago







They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with -O3. Strange...

– St.Antario
2 hours ago






2




2





@ChristianGibbons That refers to the null pointer constant case.

– Acorn
2 hours ago





@ChristianGibbons That refers to the null pointer constant case.

– Acorn
2 hours ago












5 Answers
5






active

oldest

votes


















1















How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there




No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.



But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":




object

region of data storage in the execution environment, the contents of
which can represent values




(C 2011, 3.15/1)



Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.




(not like the compiler could
know, anyway)?




Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.




Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?




Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.




Where does the standard specify this?




It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.






share|improve this answer































    1














    Constraint violation




    An integer may be converted to any pointer type. Except as previously specified, the
    result is implementation-defined, might not be correctly aligned, might not point to an
    entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5




    With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.



    Next code tries to initialize a below.



    struct A * a = (struct A *) 1;


    Initialization constraints include:




    No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2




    It is not defined that (struct A *) 1 meets that constraint.






    share|improve this answer































      1














      This comparison between 2 pointers to arbitrary objects is implementation defined.



      Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.



      A detailed discussion is here. In this detailed explanation you can see a concrete example so:




      Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first. 







      share|improve this answer

































        0














        Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.



        This however should be OK:



        struct A * a = (struct A *) 1;
        struct A * b = (struct A *) 1;
        return (int)a == (int)b;


        Since you convert an integer to a pointer and back again to get the original value.






        share|improve this answer



















        • 4





          But what exactly in the standard makes it UB?

          – PSkocik
          2 hours ago



















        0















        Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function




        Both a and b refer to the same (invalid) memory address i.e. 0x1

        Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location






        share|improve this answer


























          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55764953%2fcs-equality-operator-on-converted-pointers%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          5 Answers
          5






          active

          oldest

          votes








          5 Answers
          5






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1















          How is this refuted? Does "pointer to the same object" refer to
          addresses, even if no objects are there




          No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.



          But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
          Consider the Standard's definition of "object":




          object

          region of data storage in the execution environment, the contents of
          which can represent values




          (C 2011, 3.15/1)



          Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.




          (not like the compiler could
          know, anyway)?




          Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.




          Should we simply understand that it is
          implementation-defined since the previous results were already
          implementation-defined?




          Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.




          Where does the standard specify this?




          It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.






          share|improve this answer




























            1















            How is this refuted? Does "pointer to the same object" refer to
            addresses, even if no objects are there




            No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.



            But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
            Consider the Standard's definition of "object":




            object

            region of data storage in the execution environment, the contents of
            which can represent values




            (C 2011, 3.15/1)



            Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.




            (not like the compiler could
            know, anyway)?




            Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.




            Should we simply understand that it is
            implementation-defined since the previous results were already
            implementation-defined?




            Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.




            Where does the standard specify this?




            It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.






            share|improve this answer


























              1












              1








              1








              How is this refuted? Does "pointer to the same object" refer to
              addresses, even if no objects are there




              No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.



              But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
              Consider the Standard's definition of "object":




              object

              region of data storage in the execution environment, the contents of
              which can represent values




              (C 2011, 3.15/1)



              Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.




              (not like the compiler could
              know, anyway)?




              Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.




              Should we simply understand that it is
              implementation-defined since the previous results were already
              implementation-defined?




              Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.




              Where does the standard specify this?




              It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.






              share|improve this answer














              How is this refuted? Does "pointer to the same object" refer to
              addresses, even if no objects are there




              No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.



              But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
              Consider the Standard's definition of "object":




              object

              region of data storage in the execution environment, the contents of
              which can represent values




              (C 2011, 3.15/1)



              Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.




              (not like the compiler could
              know, anyway)?




              Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.




              Should we simply understand that it is
              implementation-defined since the previous results were already
              implementation-defined?




              Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.




              Where does the standard specify this?




              It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 26 mins ago









              John BollingerJohn Bollinger

              86k74280




              86k74280

























                  1














                  Constraint violation




                  An integer may be converted to any pointer type. Except as previously specified, the
                  result is implementation-defined, might not be correctly aligned, might not point to an
                  entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5




                  With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.



                  Next code tries to initialize a below.



                  struct A * a = (struct A *) 1;


                  Initialization constraints include:




                  No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2




                  It is not defined that (struct A *) 1 meets that constraint.






                  share|improve this answer




























                    1














                    Constraint violation




                    An integer may be converted to any pointer type. Except as previously specified, the
                    result is implementation-defined, might not be correctly aligned, might not point to an
                    entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5




                    With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.



                    Next code tries to initialize a below.



                    struct A * a = (struct A *) 1;


                    Initialization constraints include:




                    No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2




                    It is not defined that (struct A *) 1 meets that constraint.






                    share|improve this answer


























                      1












                      1








                      1







                      Constraint violation




                      An integer may be converted to any pointer type. Except as previously specified, the
                      result is implementation-defined, might not be correctly aligned, might not point to an
                      entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5




                      With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.



                      Next code tries to initialize a below.



                      struct A * a = (struct A *) 1;


                      Initialization constraints include:




                      No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2




                      It is not defined that (struct A *) 1 meets that constraint.






                      share|improve this answer













                      Constraint violation




                      An integer may be converted to any pointer type. Except as previously specified, the
                      result is implementation-defined, might not be correctly aligned, might not point to an
                      entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5




                      With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.



                      Next code tries to initialize a below.



                      struct A * a = (struct A *) 1;


                      Initialization constraints include:




                      No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2




                      It is not defined that (struct A *) 1 meets that constraint.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 20 mins ago









                      chuxchux

                      85.4k874158




                      85.4k874158























                          1














                          This comparison between 2 pointers to arbitrary objects is implementation defined.



                          Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.



                          A detailed discussion is here. In this detailed explanation you can see a concrete example so:




                          Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first. 







                          share|improve this answer






























                            1














                            This comparison between 2 pointers to arbitrary objects is implementation defined.



                            Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.



                            A detailed discussion is here. In this detailed explanation you can see a concrete example so:




                            Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first. 







                            share|improve this answer




























                              1












                              1








                              1







                              This comparison between 2 pointers to arbitrary objects is implementation defined.



                              Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.



                              A detailed discussion is here. In this detailed explanation you can see a concrete example so:




                              Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first. 







                              share|improve this answer















                              This comparison between 2 pointers to arbitrary objects is implementation defined.



                              Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.



                              A detailed discussion is here. In this detailed explanation you can see a concrete example so:




                              Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first. 








                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited 17 mins ago

























                              answered 1 hour ago









                              alinsoaralinsoar

                              9,39513354




                              9,39513354























                                  0














                                  Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.



                                  This however should be OK:



                                  struct A * a = (struct A *) 1;
                                  struct A * b = (struct A *) 1;
                                  return (int)a == (int)b;


                                  Since you convert an integer to a pointer and back again to get the original value.






                                  share|improve this answer



















                                  • 4





                                    But what exactly in the standard makes it UB?

                                    – PSkocik
                                    2 hours ago
















                                  0














                                  Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.



                                  This however should be OK:



                                  struct A * a = (struct A *) 1;
                                  struct A * b = (struct A *) 1;
                                  return (int)a == (int)b;


                                  Since you convert an integer to a pointer and back again to get the original value.






                                  share|improve this answer



















                                  • 4





                                    But what exactly in the standard makes it UB?

                                    – PSkocik
                                    2 hours ago














                                  0












                                  0








                                  0







                                  Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.



                                  This however should be OK:



                                  struct A * a = (struct A *) 1;
                                  struct A * b = (struct A *) 1;
                                  return (int)a == (int)b;


                                  Since you convert an integer to a pointer and back again to get the original value.






                                  share|improve this answer













                                  Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.



                                  This however should be OK:



                                  struct A * a = (struct A *) 1;
                                  struct A * b = (struct A *) 1;
                                  return (int)a == (int)b;


                                  Since you convert an integer to a pointer and back again to get the original value.







                                  share|improve this answer












                                  share|improve this answer



                                  share|improve this answer










                                  answered 2 hours ago









                                  dbushdbush

                                  104k14110148




                                  104k14110148








                                  • 4





                                    But what exactly in the standard makes it UB?

                                    – PSkocik
                                    2 hours ago














                                  • 4





                                    But what exactly in the standard makes it UB?

                                    – PSkocik
                                    2 hours ago








                                  4




                                  4





                                  But what exactly in the standard makes it UB?

                                  – PSkocik
                                  2 hours ago





                                  But what exactly in the standard makes it UB?

                                  – PSkocik
                                  2 hours ago











                                  0















                                  Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function




                                  Both a and b refer to the same (invalid) memory address i.e. 0x1

                                  Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location






                                  share|improve this answer






























                                    0















                                    Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function




                                    Both a and b refer to the same (invalid) memory address i.e. 0x1

                                    Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location






                                    share|improve this answer




























                                      0












                                      0








                                      0








                                      Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function




                                      Both a and b refer to the same (invalid) memory address i.e. 0x1

                                      Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location






                                      share|improve this answer
















                                      Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function




                                      Both a and b refer to the same (invalid) memory address i.e. 0x1

                                      Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited 1 hour ago

























                                      answered 1 hour ago









                                      CratylusCratylus

                                      34k53177301




                                      34k53177301






























                                          draft saved

                                          draft discarded




















































                                          Thanks for contributing an answer to Stack Overflow!


                                          • Please be sure to answer the question. Provide details and share your research!

                                          But avoid



                                          • Asking for help, clarification, or responding to other answers.

                                          • Making statements based on opinion; back them up with references or personal experience.


                                          To learn more, see our tips on writing great answers.




                                          draft saved


                                          draft discarded














                                          StackExchange.ready(
                                          function () {
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55764953%2fcs-equality-operator-on-converted-pointers%23new-answer', 'question_page');
                                          }
                                          );

                                          Post as a guest















                                          Required, but never shown





















































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown

































                                          Required, but never shown














                                          Required, but never shown












                                          Required, but never shown







                                          Required, but never shown







                                          Popular posts from this blog

                                          Gersau Kjelder | Navigasjonsmeny46°59′0″N 8°31′0″E46°59′0″N...

                                          Nässjö kommun Tettstader | Kjelder | NavigasjonsmenyeVIAFISNIGeoNamesMusicBrainz (area)

                                          Kvitkval Innhaldsliste Taksonomi og utvikling | Utsjånad og levevis | Utbreiing | Åtferd |...