値にアドレスを出力したい。以下は私が得たもので、私が欲しいものを印刷する必要があります。
// 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
そして直し方がわからない…
上記のようなユニオンを使用して同じものを印刷する他の方法はありますか?