所以我有一个非常大的指针 p,指向大约 40 个字节。
我还知道这 40 个字节包含整数、字符和其他指针。我也知道如何跳过这 40 个字节。
出于调试目的,我想打印出这些内容。我怎么做?
例如,假设我知道在 p+16 处有一个 int,我想打印这个 int。有没有办法在 C 中“从这个地址打印 4 个字节并将其格式化为 int”?
是的,只需强制转换和取消引用。假设您p
已经设置:
int i = *(int *)(p + 16);
printf("%d\n", i);
注意潜在的对齐问题 - 例如,此代码:
int i = *(int *)(p + 3);
可能会在某些处理器上导致异常(假设p
是安全对齐的int
)。在这种情况下,您需要自己组装字节。这是一个假设 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);