Development Tip

printf에서`% p`는 어디에 유용합니까?

yourdevel 2020. 12. 14. 20:53
반응형

printf에서`% p`는 어디에 유용합니까?


결국,이 두 문장은 같은 일을합니다 ...

int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);

예 (다른 주소 사용) :

0012FEE0
0012FEE0

를 사용하여 원하는대로 포인터를 형식화하는 것은 간단 %x하므로 %p옵션을 잘 사용하고 있습니까?


그들은 같은 일을하지 않습니다. 후자의 printf명령문 은 포인터 와 마찬가지로 잘못된 것으로 해석 b됩니다 .unsigned intb

포인터와 unsigned ints는 항상 같은 크기가 아니므로 서로 바꿔서 사용할 수 없습니다. 크기가 같지 않으면 (64 비트 CPU와 운영 체제가 점점 더 보편화됨에 따라 점점 더 일반적인 경우) %x주소의 절반 만 인쇄됩니다. Mac (그리고 아마도 다른 시스템)에서는 주소 망칠 것입니다 . 출력이 잘못됩니다.

항상 %p포인터에 사용하십시오 .


드물지 않은 적어도 하나의 시스템에서는 동일하게 인쇄하지 않습니다.

~/src> uname -m
i686
~/src> gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
[some output snipped]
gcc version 4.1.2 (Gentoo 4.1.2)
~/src> gcc -o printfptr printfptr.c
~/src> ./printfptr
0xbf8ce99c
bf8ce99c

0x예를 들어 포인터 버전이 접두사를 추가하는 방법에 주목하십시오 . 포인터의 크기와이를 텍스트로 가장 잘 표현하는 방법을 알고 있으므로 항상 % p를 사용하십시오.


접두사 %p표시에 의존 할 수 없습니다 0x. Visual C ++에서는 그렇지 않습니다. %#p휴대용으로 사용하십시오 .


포인터의 크기는의 크기와 다를 수 있습니다 int. 또한 구현은를 사용할 때 주소의 단순한 16 진 값 표현보다 더 나은 결과를 얻을 수 있습니다 %p.


x 부호없는 16 진수 정수 (32 비트)

p 포인터 주소

C ++ 참조에서 printf를 참조하십시오 . 둘 다 똑같이 쓰더라도 %p포인터를 인쇄하는 데 사용 합니다.


디버깅이 필요할 때 printf를 %p옵션 과 함께 사용하면 정말 도움이됩니다. NULL 값이 있으면 0x0이 표시됩니다.


x t 포인터 인수를 16 진수로 인쇄하는 데 사용됩니다.

를 사용하여 인쇄 할 때 일반적인 주소 %x는 다음과 같을 것이고 bfffc6e4사용하여 인쇄 된 정상적인 주소 는 다음과 같습니다 %p.0xbfffc6e4

참고 URL : https://stackoverflow.com/questions/2369541/where-is-p-useful-with-printf

반응형