我想在一个值上打印出一些地址。
以下是我得到的,我必须打印出我想要的东西。
// 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
不知道如何修复。。。
有没有其他方法可以用上面这样的工会打印出同样的东西?