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

1

工会可以拥有任何一个成员,但不能同时拥有两者。哪一个取决于您(通常在单独的变量中跟踪)。

注意

xptr.ptr = z;
xptr.num = n;

损坏 的值ptr,因此当您稍后引用它时,它包含错误的数据,从而导致您的 BAD ACCESS 错误。

于 2013-10-25T19:08:54.977 回答