所以我有一个非常大的指针p,指向大约40个字节。如何在大指针中打印字节的子集?
我也知道这40个字节包含整数,字符和其他指针。我知道如何跳过这40个字节。
为了进行调试,我想打印出这些内容。我怎么做?
例如,可以说我知道在p + 16有一个int,我想打印这个int。有没有办法“从这个地址打印4个字节,并在C中格式化为一个int”?
所以我有一个非常大的指针p,指向大约40个字节。如何在大指针中打印字节的子集?
我也知道这40个字节包含整数,字符和其他指针。我知道如何跳过这40个字节。
为了进行调试,我想打印出这些内容。我怎么做?
例如,可以说我知道在p + 16有一个int,我想打印这个int。有没有办法“从这个地址打印4个字节,并在C中格式化为一个int”?
是的,只是铸&解除引用。假设你已经p
已经建立:
int i = *(int *)(p + 16);
printf("%d\n", i);
当心潜在的对齐问题 - 例如,此代码:
int i = *(int *)(p + 3);
可能会导致某些处理器的异常(假设p
一个被安全地对齐那就是)。在这种情况下,你需要自己组装字节。这是一个假设一个4字节整数和8位字节的例子。请务必注意字节序:
unsigned char *p;
int bigEndian = p[3] << 24 + p[4] << 16 + p[5] << 8 + p[6];
int littleEndian = p[3] + p[4] << 8 + p[5] << 16 + p[6] << 24;
你可以做这样的事情:
printf ("%d", *(int*)(p+16));
一个更好的办法是让你想打印的结构的结构,如果是可以这样表达的东西。喜欢的东西:
typedef struct someStruct {
int field1;
float field2;
char field3[8];
int field4;
} someStruct;
然后,你可以做这样的事情:
struct someStruct *p = (struct someStruct*)ptr;
printf ("%d", p->field4);
您将需要考虑结构填充。编译器可以自由地在结构中弹出额外的字节来提高性能。 – EvilTeach
好点。例如,您可能需要添加一个编译器指令来告诉它打包结构的字节。 – user1118321
谢谢!这工作! – wrecktangle