2013-10-25 3 views
0

값에 일부 주소를 인쇄하고 싶습니다. 다음은 제가 원하는 것을 출력 해 놓은 것입니다.C : 포인터 및 합집합 및 주소

dumper outputs... 
    Address   +x00   +x04 
0x7fff5ad8c980  000000b8  000000ff 
0x7fff5ad8c990  000000a8  000000ff 
0x7fff5ad8c9a0  000000e1  000000ff 
0x7fff5ad8c9b0  00000001  00000000 
0x7fff5ad8c9c0  00000000  00000000 

그러나 이것은 추한 외모와 나는이 사용하는 조합을 수행해야합니다

// 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); 
    } 
} 
} 

그리고 출력은 다음과 같다. 그리고 나는 다음을 시도해 봤다.

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)); 
     } 
    } 

} 

I 라인 printf("%p %.08x %.08x\n"

스레드 1의

의 오류를 얻고있다 ... EXC_BAD_ACCESS

그리고 그것을 해결하는 방법을 모른다

위와 같은 조합을 사용하여 같은 것을 인쇄하는 다른 방법이 있습니까?

+1

나는 당신이 무엇을하려고하는지 전혀 모른다. 결국 무엇을 인쇄해야합니까? –

+1

'union '대신에'struct'를 쓰려고했다는 뜻인가요? 'union '의 요소들은 같은 메모리 위치를 점유하므로'xptr.ptr = z;'와'xptr.num = n;'명령문은 모두 같은 바이트의 메모리에 영향을 미친다. 다음에'xptr.ptr'에 접근하려고하면 메모리 오류가 발생합니다. –

+0

"구조체"가 아니라 노동 조합이 아니라고 생각합니다. 시도해 봐. 노조에서 포인터를 사용하지 마십시오. 결과는 예측할 수 없습니다. – PMF

답변

1

노동 조합은 두 구성원 중 하나만 보유 할 수 있지만 둘 다를 보유 할 수는 없습니다. 어느 것이 당신에게 달려 있습니까 (대개 별도의 변수에서 추적). 나중에 참조 할 때

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

부패 ptr의 값이 때문에, 그것은 당신의 나쁜 액세스 오류에 이르게 잘못된 데이터를 보유하고 있음을

참고.