1

所以我有一个非常大的指针 p,指向大约 40 个字节。

我还知道这 40 个字节包含整数、字符和其他指针。我也知道如何跳过这 40 个字节。

出于调试目的,我想打印出这些内容。我怎么做?

例如,假设我知道在 p+16 处有一个 int,我想打印这个 int。有没有办法在 C 中“从这个地址打印 4 个字节并将其格式化为 int”?

4

2 回答 2

4

是的,只需强制转换和取消引用。假设您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;
于 2012-09-30T02:49:12.143 回答
3

你可以这样做:

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);
于 2012-09-30T02:50:24.673 回答