Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. Clever Code
  4. char x = 0;

char x = 0;

Scheduled Pinned Locked Moved Clever Code
performancequestionlounge
17 Posts 9 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P PJ Arends

    Given the following code, what would you expect the output to be?

    #include <string>
    #include <iostream>
    using namespace std;

    char a = 'a';
    char b = 'b';
    char res1 = 0;
    char c = 'c';
    char res2 = 0;
    char d = 'd';
    char res3 = 0;

    int main(int argc, char* argv[])
    {
    string s = &a;
    cout << s << endl;
    s = &b;
    cout << s << endl;
    s = &c;
    cout << s << endl;
    s = &d;
    cout << s << endl;

    return 0;
    

    }

    The output I had expected was:

    ab
    b
    c
    d

    But that is not what I got. The output I ended up with is:

    abcd<random garbage>
    bcd<random garbage>
    cd<random garbage>
    d<random garbage>

    It turns out that the NULL values I stored in res1 etc. were not being stored in memory in the exact sequence that I had declared them. They were instead being stored in some other place in memory.


    It's not rocket surgery!

    Within you lies the power for good, use it!!!

    L Offline
    L Offline
    Lost User
    wrote on last edited by
    #7

    That's usually what you get for moving from assembly to C++.:) I made a booboo myself: Booboo

    1 Reply Last reply
    0
    • P PJ Arends

      Given the following code, what would you expect the output to be?

      #include <string>
      #include <iostream>
      using namespace std;

      char a = 'a';
      char b = 'b';
      char res1 = 0;
      char c = 'c';
      char res2 = 0;
      char d = 'd';
      char res3 = 0;

      int main(int argc, char* argv[])
      {
      string s = &a;
      cout << s << endl;
      s = &b;
      cout << s << endl;
      s = &c;
      cout << s << endl;
      s = &d;
      cout << s << endl;

      return 0;
      

      }

      The output I had expected was:

      ab
      b
      c
      d

      But that is not what I got. The output I ended up with is:

      abcd<random garbage>
      bcd<random garbage>
      cd<random garbage>
      d<random garbage>

      It turns out that the NULL values I stored in res1 etc. were not being stored in memory in the exact sequence that I had declared them. They were instead being stored in some other place in memory.


      It's not rocket surgery!

      Within you lies the power for good, use it!!!

      S Offline
      S Offline
      scott_hackett
      wrote on last edited by
      #8

      I bet the chars got stored sequentially in memory, like this... abcd????? s then points to the 'a' memory location and cout prints "abcd" and whatever memory follows it until it hits the first 0 (what it thinks is the null terminator). s is then moved to point to the 'b' memory location and prints "bcd" and whatever memory follows it and so on and so forth. Interesting!

      P 1 Reply Last reply
      0
      • P PJ Arends

        Given the following code, what would you expect the output to be?

        #include <string>
        #include <iostream>
        using namespace std;

        char a = 'a';
        char b = 'b';
        char res1 = 0;
        char c = 'c';
        char res2 = 0;
        char d = 'd';
        char res3 = 0;

        int main(int argc, char* argv[])
        {
        string s = &a;
        cout << s << endl;
        s = &b;
        cout << s << endl;
        s = &c;
        cout << s << endl;
        s = &d;
        cout << s << endl;

        return 0;
        

        }

        The output I had expected was:

        ab
        b
        c
        d

        But that is not what I got. The output I ended up with is:

        abcd<random garbage>
        bcd<random garbage>
        cd<random garbage>
        d<random garbage>

        It turns out that the NULL values I stored in res1 etc. were not being stored in memory in the exact sequence that I had declared them. They were instead being stored in some other place in memory.


        It's not rocket surgery!

        Within you lies the power for good, use it!!!

        D Offline
        D Offline
        Dan Neely
        wrote on last edited by
        #9

        I don't know if you're allowed to submit a full project or just the .h/.cpp files, but if the former you might try turning off all optimization to see if you can stop the compiler from outsmarting your designed WTFs.

        -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

        P 1 Reply Last reply
        0
        • D Dan Neely

          I don't know if you're allowed to submit a full project or just the .h/.cpp files, but if the former you might try turning off all optimization to see if you can stop the compiler from outsmarting your designed WTFs.

          -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

          P Offline
          P Offline
          PJ Arends
          wrote on last edited by
          #10

          dan neely wrote:

          you might try turning off all optimization

          That was the first thing I tried, did not help:sigh: I already have another, possibly even better work-around:cool:


          It's not rocket surgery!

          Within you lies the power for good, use it!!!

          1 Reply Last reply
          0
          • S scott_hackett

            I bet the chars got stored sequentially in memory, like this... abcd????? s then points to the 'a' memory location and cout prints "abcd" and whatever memory follows it until it hits the first 0 (what it thinks is the null terminator). s is then moved to point to the 'b' memory location and prints "bcd" and whatever memory follows it and so on and so forth. Interesting!

            P Offline
            P Offline
            PJ Arends
            wrote on last edited by
            #11

            Yes, that is exactly what happens. The only problem is that uninitialized variables and variables initialized to zero do not follow the same behavior.


            It's not rocket surgery!

            Within you lies the power for good, use it!!!

            1 Reply Last reply
            0
            • P PJ Arends

              mav.northwind wrote:

              My first thought after seeing this was "this should blow up right in your face and you deserve it!"

              Yeah, normally I would never use this, but it is for my entry in this[^] competition. So the worse the better. The result is just not what I had expected. I have developed another work-around though.


              Darker than a black steer's tookus on a moonless praire night

              Within you lies the power for good, use it!!!

              S Offline
              S Offline
              Sebastian Schneider
              wrote on last edited by
              #12

              Then why don't you just assign something else to them first, then assign the 0, just to "work around those stupid compiler limitations"?

              Cheers, Sebastian -- "If it was two men, the non-driver would have challenged the driver to simply crash through the gates. The macho image thing, you know." - Marc Clifton

              P 1 Reply Last reply
              0
              • S Sebastian Schneider

                Then why don't you just assign something else to them first, then assign the 0, just to "work around those stupid compiler limitations"?

                Cheers, Sebastian -- "If it was two men, the non-driver would have challenged the driver to simply crash through the gates. The macho image thing, you know." - Marc Clifton

                P Offline
                P Offline
                PJ Arends
                wrote on last edited by
                #13

                That just makes too much sense.


                Why do things that only happen to stupid people keep happening to me?

                Within you lies the power for good, use it!!!

                1 Reply Last reply
                0
                • P PJ Arends

                  Given the following code, what would you expect the output to be?

                  #include <string>
                  #include <iostream>
                  using namespace std;

                  char a = 'a';
                  char b = 'b';
                  char res1 = 0;
                  char c = 'c';
                  char res2 = 0;
                  char d = 'd';
                  char res3 = 0;

                  int main(int argc, char* argv[])
                  {
                  string s = &a;
                  cout << s << endl;
                  s = &b;
                  cout << s << endl;
                  s = &c;
                  cout << s << endl;
                  s = &d;
                  cout << s << endl;

                  return 0;
                  

                  }

                  The output I had expected was:

                  ab
                  b
                  c
                  d

                  But that is not what I got. The output I ended up with is:

                  abcd<random garbage>
                  bcd<random garbage>
                  cd<random garbage>
                  d<random garbage>

                  It turns out that the NULL values I stored in res1 etc. were not being stored in memory in the exact sequence that I had declared them. They were instead being stored in some other place in memory.


                  It's not rocket surgery!

                  Within you lies the power for good, use it!!!

                  L Offline
                  L Offline
                  Lost User
                  wrote on last edited by
                  #14

                  My initial response ie "EEK!" - this code, if it did work, would be 'getting away with it' except that you didn't. I would kick it ould in a code review (Yes, I do QA!). Elaine (harsh fluffy tigress)

                  The tigress is here :-D

                  1 Reply Last reply
                  0
                  • P PJ Arends

                    Given the following code, what would you expect the output to be?

                    #include <string>
                    #include <iostream>
                    using namespace std;

                    char a = 'a';
                    char b = 'b';
                    char res1 = 0;
                    char c = 'c';
                    char res2 = 0;
                    char d = 'd';
                    char res3 = 0;

                    int main(int argc, char* argv[])
                    {
                    string s = &a;
                    cout << s << endl;
                    s = &b;
                    cout << s << endl;
                    s = &c;
                    cout << s << endl;
                    s = &d;
                    cout << s << endl;

                    return 0;
                    

                    }

                    The output I had expected was:

                    ab
                    b
                    c
                    d

                    But that is not what I got. The output I ended up with is:

                    abcd<random garbage>
                    bcd<random garbage>
                    cd<random garbage>
                    d<random garbage>

                    It turns out that the NULL values I stored in res1 etc. were not being stored in memory in the exact sequence that I had declared them. They were instead being stored in some other place in memory.


                    It's not rocket surgery!

                    Within you lies the power for good, use it!!!

                    J Offline
                    J Offline
                    John Rossini
                    wrote on last edited by
                    #15

                    if you put all the characters into a struct, and put #pragma pack before the struct, I think you'll get what you were expecting.

                    1 Reply Last reply
                    0
                    • D Dan Neely

                      Since you never used res* it's possible the compiler optimized them out of existence entirely. If you use by never modify them it's possible they were optimized into a single memory location.

                      -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

                      S Offline
                      S Offline
                      Sathesh Sakthivel
                      wrote on last edited by
                      #16

                      :)

                      Regards, Satips.:rose: Don't walk in front of me, I may not follow; Don't walk behind me, I may not lead; Walk beside me, and just be my friend. - Albert Camus

                      1 Reply Last reply
                      0
                      • P PIEBALDconsult

                        Yeah, don't rely on side effects like that.

                        S Offline
                        S Offline
                        Sathesh Sakthivel
                        wrote on last edited by
                        #17

                        :laugh::laugh:

                        Regards, Satips.:rose: Don't walk in front of me, I may not follow; Don't walk behind me, I may not lead; Walk beside me, and just be my friend. - Albert Camus

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups