我想在一个值上打印出一些地址。以下是我得到并打印出我想要的东西。
// I need the first address to start with zero.
void printoutAddr(char* x, int n, int sign) {
printf(" Address +x00 +x04\n");
intptr_t y = (intptr_t)x;
// to round it down every 16 byte
char *z = (char *)((y + 15)&~15);
// or char *z = (char *)(y&~15);
if (sign>0) {
for (int i=0; i<n; i++) {
printf("%p %.08x %.08x\n"
, (char *)(z+16*i)
, *(char *)(z+16*i)
, *(char *)(z+4+16*i);
}
} else {
for (int i=n; i>0; i--) {
printf("%p %.08x %.08x\n"
, (char *)(z+16*i)
, *(char *)(z+16*i)
, *(char *)(z+4+16*i);
}
}
}
输出如下:
dumper outputs...
Address +x00 +x04
0x7fff5ad8c980 000000b8 000000ff
0x7fff5ad8c990 000000a8 000000ff
0x7fff5ad8c9a0 000000e1 000000ff
0x7fff5ad8c9b0 00000001 00000000
0x7fff5ad8c9c0 00000000 00000000
但这看起来很难看,我需要使用联合来做到这一点。我被困在尝试以下。
void printoutAddr(char* x, int n, int sign) {
printf(" Address +x00 +x04\n");
intptr_t y = (intptr_t)x;
char *z = (char *)((y + 15)&~15);
union ptrs {
char * ptr ;
int num ;
} xptr ;
xptr.ptr = z;
xptr.num = n;
if (sign>0) {
for (int i=0; i<n; i++) {
printf("%p %.08x %.08x\n"
, (char *)(xptr.ptr+16*i)
, *(char *)(xptr.ptr+16*i)
, *(char *)(xptr.ptr+4+16*i));
}
} else {
for (int i=n; i>0; i--) {
printf("%p %.08x %.08x\n"
, (char *)(xptr.ptr+16*i)
, *(char *)(xptr.ptr+16*i)
, *(char *)(xptr.ptr+4+16*i));
}
}
}
我得到的错误
在线上printf("%p %.08x %.08x\n"
线程 1:EXC_BAD_ACCESS
而且不知道怎么解决...
有没有其他方法可以使用上面的联合打印出同样的东西?