How to print out the memory contents of a variable in C?

后端 未结 9 683
滥情空心
滥情空心 2020-12-13 14:48

Suppose I do a

double d = 234.5;

I want to see the memory contents of d [the whole 8 bytes]

How do I do that?

相关标签:
9条回答
  • 2020-12-13 15:02

    Try

    union Plop
    {
        double   value;
        char     data[sizeof(double)];
    };
    
    Plop print;
    print.value = 234.5;
    
    std::copy(print.data,print.data+sizeof(double),std::ostream_iterator<int>(std::cout)," ");
    std::cout << std::endl;
    
    0 讨论(0)
  • 2020-12-13 15:10

    I think you can use shift operation and mask to "mask out" the actual bits.

    int t = 128;

    for(int i=0;i<8;++i) { printf("%d", p & t);

    p =>> 1;

    t =>> 1; }

    0 讨论(0)
  • 2020-12-13 15:12

    using your friendly debugger is the best way to see the value of the memory location, that is if u just want to see.

    0 讨论(0)
  • 2020-12-13 15:13

    If you're looking to view this from gdb you can issue:

    x /gx d
    

    The g will print the value as a giant (8 bytes)

    0 讨论(0)
  • 2020-12-13 15:25
    unsigned char *p = (unsigned char *)&d;
    int i;
    
    for (i = 0; i < sizeof d; i++)
        printf("%02x ", p[i]);
    
    0 讨论(0)
  • 2020-12-13 15:25

    Courtesy of my library of useful snippets, here's a solution in C, complete with test harness, and providing both hex and ASCII data:

    #include <stdio.h>
    
    void hexDump (char *desc, void *addr, int len) {
        int i;
        unsigned char buff[17];       // stores the ASCII data
        unsigned char *pc = addr;     // cast to make the code cleaner.
    
        // Output description if given.
    
        if (desc != NULL)
            printf ("%s:\n", desc);
    
        // Process every byte in the data.
    
        for (i = 0; i < len; i++) {
            // Multiple of 16 means new line (with line offset).
    
            if ((i % 16) == 0) {
                // Just don't print ASCII for the zeroth line.
    
                if (i != 0)
                    printf ("  %s\n", buff);
    
                // Output the offset.
    
                printf ("  %04x ", i);
            }
    
            // Now the hex code for the specific character.
    
            printf (" %02x", pc[i]);
    
            // And store a printable ASCII character for later.
    
            if ((pc[i] < 0x20) || (pc[i] > 0x7e))
                buff[i % 16] = '.';
            else
                buff[i % 16] = pc[i];
            buff[(i % 16) + 1] = '\0';
        }
    
        // Pad out last line if not exactly 16 characters.
    
        while ((i % 16) != 0) {
            printf ("   ");
            i++;
        }
    
        // And print the final ASCII bit.
    
        printf ("  %s\n", buff);
    }
    
    int main (int argc, char *argv[]) {
        double d1 = 234.5;
        char s1[] = "a 15char string";
        char s2[] = "This is a slightly longer string";
        hexDump ("d1", &d1, sizeof d1);
        hexDump ("s1", &s1, sizeof s1);
        hexDump ("s2", &s2, sizeof s2);
        return 0;
    }
    

    The output on my system is:

    d1:
      0000  00 00 00 00 00 50 6d 40                          .....Pm@
    s1:
      0000  61 20 31 35 63 68 61 72 20 73 74 72 69 6e 67 00  a 15char string.
    s2:
      0000  54 68 69 73 20 69 73 20 61 20 73 6c 69 67 68 74  This is a slight
      0010  6c 79 20 6c 6f 6e 67 65 72 20 73 74 72 69 6e 67  ly longer string
      0020  00                                               .
    

    Since this question is tagged C++ too, here's an iostream version to compare. Even if you're not a particular fan of iostreams, it still fits in if you're already using them. Being able to use hexdump(any_obj) is nice too, but of course can be done with just a delegating function template similar to the ctor.

    #include <iomanip>
    #include <ostream>
    #include <string>
    
    struct hexdump {
      void const* data;
      int len;
    
      hexdump(void const* data, int len) : data(data), len(len) {}
    
      template<class T>
      hexdump(T const& v) : data(&v), len(sizeof v) {}
    
      friend
      std::ostream& operator<<(std::ostream& s, hexdump const& v) {
        // don't change formatting for s
        std::ostream out (s.rdbuf());
        out << std::hex << std::setfill('0');
    
        unsigned char const* pc = reinterpret_cast<unsigned char const*>(v.data);
    
        std::string buf;
        buf.reserve(17); // premature optimization
    
        int i;
        for (i = 0; i < v.len; ++i, ++pc) {
          if ((i % 16) == 0) {
            if (i) {
              out << "  " << buf << '\n';
              buf.clear();
            }
            out << "  " << std::setw(4) << i << ' ';
          }
    
          out << ' ' << std::setw(2) << unsigned(*pc);
          buf += (0x20 <= *pc && *pc <= 0x7e) ? *pc : '.';
        }
        if (i % 16) {
          char const* spaces16x3 = "                                                ";
          out << &spaces16x3[3 * (i % 16)];
        }
        out << "  " << buf << '\n';
    
        return s;
      }
    };
    
    int main() {
      std::cout << "double:\n" << hexdump(234.5);
      std::cout << "string 1:\n" << hexdump("a 15char string");
      std::cout << "string 2:\n" << hexdump("This is a slightly longer string");
    
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题