C++ 如何打印出C中变量的内存内容?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2376915/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to print out the memory contents of a variable in C?
提问by Lazer
Suppose I do a
假设我做了一个
double d = 234.5;
I want to see the memory contents of d
[the whole 8 bytes]
我要查看d
【整个8个字节】的内存内容
How do I do that?
我怎么做?
采纳答案by Alok Singhal
double d = 234.5;
/* 1. use a union */
union u {
double d;
unsigned char c[sizeof(double)];
};
union u tmp;
size_t i;
tmp.d = d;
for (i=0; i < sizeof(double); ++i)
printf("%02x\n", tmp.c[i]);
/* 2. memcpy */
unsigned char data[sizeof d];
size_t i;
memcpy(data, &d, sizeof d);
for (i=0; i < sizeof d; ++i)
printf("%02x\n", data[i]);
/* 3. Use a pointer to an unsigned char to examine the bytes */
unsigned char *p = (unsigned char *)&d;
size_t i;
for (i=0; i < sizeof d; ++i)
printf("%02x\n", p[i]);
All the methods show you the bytes—but the same double
value may print the bytes differently on different systems, e.g., due to different encodings (rare), or different endianness.
所有的方法都会显示字节——但是相同的double
值可能会在不同的系统上以不同的方式打印字节,例如,由于不同的编码(罕见)或不同的字节顺序。
回答by caf
unsigned char *p = (unsigned char *)&d;
int i;
for (i = 0; i < sizeof d; i++)
printf("%02x ", p[i]);
回答by paxdiablo
Courtesy of my library of useful snippets, here's a solution in C, complete with test harness, and providing both hex and ASCII data:
感谢我的有用片段库,这是一个 C 语言解决方案,配有测试工具,并提供十六进制和 ASCII 数据:
#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] = '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 .
';
}
// 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:
我的系统上的输出是:
#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;
}
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.
由于这个问题也被标记为 C++,这里有一个 iostream 版本进行比较。即使您不是 iostreams 的特别粉丝,如果您已经在使用它们,它仍然适合。能够使用hexdump(any_obj)
也很好,但当然可以只用一个类似于ctor的委托函数模板来完成。
#include <stdio.h>
int main (void)
{
float f = 10.0f;
struct Float {
unsigned char bit01:1;
unsigned char bit02:1;
unsigned char bit03:1;
unsigned char bit04:1;
unsigned char bit05:1;
unsigned char bit06:1;
unsigned char bit07:1;
unsigned char bit08:1;
unsigned char bit09:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
unsigned char bit16:1;
unsigned char bit17:1;
unsigned char bit18:1;
unsigned char bit19:1;
unsigned char bit20:1;
unsigned char bit21:1;
unsigned char bit22:1;
unsigned char bit23:1;
unsigned char bit24:1;
unsigned char bit25:1;
unsigned char bit26:1;
unsigned char bit27:1;
unsigned char bit28:1;
unsigned char bit29:1;
unsigned char bit30:1;
unsigned char bit31:1;
unsigned char bit32:1;
};
struct Float *F;
F = (struct Float *) &f;
printf("\nMSB -->1 bit for sign bit; 8 bit for exponent; 23 bit for mantisa<-- LSB\n");
printf("%d ", F->bit32);
printf("%d", F->bit31);
printf("%d", F->bit30);
printf("%d", F->bit29);
printf("%d", F->bit28);
printf("%d", F->bit27);
printf("%d", F->bit26);
printf("%d", F->bit25);
printf("%d ", F->bit24);
printf("%d", F->bit23);
printf("%d", F->bit22);
printf("%d", F->bit21);
printf("%d", F->bit20);
printf("%d", F->bit19);
printf("%d", F->bit18);
printf("%d", F->bit17);
printf("%d", F->bit16);
printf("%d", F->bit15);
printf("%d", F->bit14);
printf("%d", F->bit13);
printf("%d", F->bit12);
printf("%d", F->bit11);
printf("%d", F->bit10);
printf("%d", F->bit09);
printf("%d", F->bit08);
printf("%d", F->bit07);
printf("%d", F->bit06);
printf("%d", F->bit05);
printf("%d", F->bit04);
printf("%d", F->bit03);
printf("%d", F->bit02);
printf("%d\n", F->bit01);
}
回答by sganesh
If you want to print the double values in bits try this. I have tried for float value. If you changed that you can be able to view the double value in 64 bits.
如果你想以位打印双精度值,试试这个。我尝试过浮点值。如果您更改了它,您就可以查看 64 位的双精度值。
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;
回答by Martin York
Try
尝试
x /gx d
回答by nall
If you're looking to view this from gdb you can issue:
如果您想从 gdb 查看这个,您可以发出:
##代码##The g will print the value as a giant (8 bytes)
g 会将值打印为一个巨人(8 个字节)
回答by the100rabh
using your friendly debugger is the best way to see the value of the memory location, that is if u just want to see.
使用友好的调试器是查看内存位置值的最佳方式,也就是说,如果您只想查看。
回答by Arun
Did you try taking the address of d
and print sizeof( d )
bytes starting from that address?
您是否尝试从该地址开始获取地址d
并打印sizeof( d )
字节?
回答by Zhimin Zong
I think you can use shift operation and mask to "mask out" the actual bits.
我认为您可以使用移位操作和掩码来“屏蔽”实际位。
int t = 128;
INT = 128;
for(int i=0;i<8;++i) { printf("%d", p & t);
for(int i=0;i<8;++i) { printf("%d", p & t);
p =>> 1;
p =>> 1;
t =>> 1; }
t =>> 1; }