C에서 변수 주소를 인쇄하기 위해 \% p, \% u 및 \% x를 사용하는 것의 차이점은 무엇입니까?


최상 답변

어떤 주소를 인쇄해야하는 경우 , 또는 포인터 변수의 내용, 진정으로 이식 가능한 유일한 방법은 \% p 형식 ​​지정자를 사용하는 것입니다. C 표준에 따르면 인쇄 된 문자는 구현에 따라 정의되지만 실제로 대부분의 C 라이브러리 구현은 주소를 나타내는 16 진수 시퀀스를 생성합니다.

\% u 및 \% x 형식 지정자는 부호없는 정수를 예상합니다. 값을 각각 10 진수와 16 진수로 인쇄합니다. 주소를 예상하지 않습니다 .

\% u 또는 \% x (또는 \% p 이외의 항목)를 사용하여 주소를 인쇄하면 일부 환경에서 작동하는 것처럼 보일 수 있지만 실제로는 정의되지 않은 동작 휴대용 불가 . 포인터의 크기가 부호없는 정수 (또는 다른 정수 데이터 유형)의 크기와 같다고 가정 할 수 없습니다. 예를 들어 많은 64 비트 환경에서 부호없는 정수는 32 비트입니다. 포인터의 비트 수가 사용자 환경에서 부호없는 정수의 비트 수와 일치하지 않고 \% u 또는 \% x를 사용하여 주소를 인쇄하려고하면 잘못된 출력이 표시되고 후속 출력이 출력됩니다. printf에 대한 동일한 호출의 항목도 올바르지 않을 수 있습니다.

따라서 주소를 인쇄하려면 정의되지 않은 동작을 방지하는 이식 가능한 코드에 대해 항상 \% p 형식 ​​지정자를 사용하십시오. 포인터의 크기가 다른 C 데이터 유형의 크기와 같다고 가정하지 마십시오.

답변

\%p 변환은 포인터를 올바르게 이해합니다. \%p 변환은 특정 구현 방식으로 포인터를 인쇄합니다.

\%u\%x 변환은 포인터 유형과 크기가 같을 수도 있고 아닐 수도있는 unsigned int 또는 int 유형에 대한 것입니다. \%u 변환은 부호없는 십진 정수를 인쇄하는 반면 \%x는 부호없는 16 진 정수를 소문자로 인쇄합니다.

To \%u 또는 \%x를 사용하여 포인터를 인쇄하려면 포인터를 int 또는 unsigned int. sizeof(void *) > sizeof(int) 인 경우 해당 캐스트가 정보를 잃을 수 있습니다.

참조 : printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다