printf에서`% p`는 어디에 유용합니까?
결국,이 두 문장은 같은 일을합니다 ...
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
예 (다른 주소 사용) :
0012FEE0
0012FEE0
를 사용하여 원하는대로 포인터를 형식화하는 것은 간단 %x
하므로 %p
옵션을 잘 사용하고 있습니까?
그들은 같은 일을하지 않습니다. 후자의 printf
명령문 은 포인터 와 마찬가지로 잘못된 것으로 해석 b
됩니다 .unsigned int
b
포인터와 unsigned int
s는 항상 같은 크기가 아니므로 서로 바꿔서 사용할 수 없습니다. 크기가 같지 않으면 (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
'Development Tip' 카테고리의 다른 글
두 Excel 워크 시트의 차이점을 찾으십니까? (0) | 2020.12.14 |
---|---|
.NET 리플렉션에서 BindingFlags.DeclaredOnly와 함께 GetProperties () 사용 (0) | 2020.12.14 |
C # 숫자 열거 형 값 (문자열) (0) | 2020.12.14 |
Android : 버튼을 길게 클릭-> 작업 수행 (0) | 2020.12.14 |
ASP.NET WebApi : WebApi HttpClient를 사용하여 파일 업로드로 멀티 파트 게시를 수행하는 방법 (0) | 2020.12.14 |