代码之家  ›  专栏  ›  技术社区  ›  user2671513

C:指针、并集和地址

  •  0
  • user2671513  · 技术社区  · 11 年前

    我想在一个值上打印出一些地址。 以下是我得到的,我必须打印出我想要的东西。

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

    不知道如何修复。。。

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

    1 回复  |  直到 11 年前
        1
  •  1
  •   Attila    11 年前

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

    请注意

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

    破坏的价值 ptr ,所以当您以后引用它时,它包含错误的数据,这会导致BAD ACCESS错误。