0

値にアドレスを出力したい。以下は私が得たもので、私が欲しいものを印刷する必要があります。

// 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

そして直し方がわからない…

上記のようなユニオンを使用して同じものを印刷する他の方法はありますか?

4

1 に答える 1