如何在大指针中打印字节子集?

时间:2012-09-30 02:42:38

标签: c pointers

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

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

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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);