我想打印一个值的地址。 以下是我得到的,并打印出我想要的东西。
// 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
但这看起来很难看,我需要使用union来做到这一点。 而且我遇到了以下问题。
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"
:EXC_BAD_ACCESS
并且不知道如何解决它......
有没有其他方法可以使用上面的工会打印出同样的东西?
答案 0 :(得分:1)
工会可以拥有任何一个成员,但不能同时拥有两个成员。哪一个取决于您(通常在单独的变量中跟踪)。
请注意
xptr.ptr = z;
xptr.num = n;
会破坏ptr
的值,因此当您稍后引用它时,它会保留错误的数据,从而导致您的BAD ACCESS错误。