C:指针和联合和地址

时间:2013-10-25 19:01:00

标签: c pointers memory stack unions

我想打印一个值的地址。  以下是我得到的,并打印出我想要的东西。

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

行 线程1的

EXC_BAD_ACCESS

并且不知道如何解决它......

有没有其他方法可以使用上面的工会打印出同样的东西?

1 个答案:

答案 0 :(得分:1)

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

请注意

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

会破坏ptr的值,因此当您稍后引用它时,它会保留错误的数据,从而导致您的BAD ACCESS错误。