2016-09-24 7 views
2

십진법 표기법으로 포인터를 인쇄하려면 어떻게해야합니까?십진수 표기법의 Printf 포인터

-Wall을 사용하여 컴파일 할 때 원하는 결과가 나타나지 않습니다. 오류를 이해하고 -Wall으로 컴파일하고 싶습니다. 하지만 어떻게 십진수 표기법으로 포인터를 인쇄 할 수 있습니까?

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int* ptr = malloc(sizeof(int)); 
    printf("%p\n", ptr);     // Hexadecimal notation 
    printf("%u\n", ptr);     // -Wformat: %u expects unsigned int, has int * 
    printf("%u\n", (unsigned int) ptr); // -Wpointer-to-int-cast 
    return EXIT_SUCCESS; 
} 

(I는 도트 그래프 노드 식별자로 포인터를 사용하고 있기 때문에이 필요하고 0x.. 유효한 식별자가 아니다.)

답변

7

C 인 데이터 유형 이름 uintptr_t을 갖는다 포인터를 잡을만큼 충분히 큽니다. % p를 사용하면 -pedantic 사용하여 코드를 컴파일 할 경우 무효 * 포인터, GCC는 경고합니다 기대하는

#include <stdio.h> 
#include <stdlib.h> 
#include <inttypes.h> 

int main(void) 
{ 
    int* ptr = malloc(sizeof *ptr); 
    printf("%p\n", (void *)ptr);     // Hexadecimal notation 
    printf("%" PRIuPTR "\n", (uintptr_t)ptr); 
    return EXIT_SUCCESS; 
} 

참고 : 하나 개의 솔루션 (캐스트) (uintptr_t)에 포인터 변환이 아래 그림을 좋아 인쇄하는 것입니다.

string format for intptr_t and uintptr_t도 관련있는 것 같습니다.

1

'일부 플랫폼은 파일에 PRI*PTR 매크로를 제공하지 않는다는보고가 있습니다. 귀하의 경우라면 printf("%ju\n", (uintmax_t)ptr);을 대신 사용해보십시오.

... GNU C로 작업하기 때문에 매크로가 있어야한다고 생각합니다.