2012-09-30 18 views
1

所以我有一个非常大的指针p,指向大约40个字节。如何在大指针中打印字节的子集?

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

为了进行调试,我想打印出这些内容。我怎么做?

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

回答

4

是的,只是铸&解除引用。假设你已经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; 
+0

谢谢!这工作! – wrecktangle

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); 
+1

您将需要考虑结构填充。编译器可以自由地在结构中弹出额外的字节来提高性能。 – EvilTeach

+0

好点。例如,您可能需要添加一个编译器指令来告诉它打包结构的字节。 – user1118321