2016-12-20 2 views
-3
#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int a=2; 
    ptr=&a; 
    printf("%p\n",ptr); 
    printf("%d\n",ptr); 
    printf("%p\n",a); 
    return 0; 
} 

I 얻을 출력은 :% p 란 정확히 무엇이며 % d를 사용하여 포인터의 int 값을 출력하는 것과 다른 점은 무엇입니까?

% ./a.out 
0x7ffe12032c40 
302197824 
0x2 
% 

(분명 때문에 ASLR의) 첫 두 출력 값이 변경 및 0x2로는 일정하게 유지된다.

+5

'printf ("% d \ n", ptr);은 (는) 정의되지 않은 동작입니다. – Ari0nhh

+6

포인터의 크기가 항상 int의 크기와 같지 않다 –

+1

또한'size_t' ('% u' 대신)에'% zu'를 사용하고'ssize_t'에'% zd'를 사용하십시오. – e0k

답변

1

크기를 수행 그래서 대신 % 포인트의 % d 개를 사용할 수 없습니다 % 포인트가 사용됩니다 포인터 변수에 저장된 인쇄 값 또한 int 변수와 함께 % p를 사용하는 인쇄 값은 정의되지 않은 동작입니다 (포인터와 int가 동일한 크기를 갖는 시스템에서 올바른 결과를 볼 수는 있지만 C 표준은 정의되지 않은 동작 임)

sizeof int는 컴파일러에 의해 정의되고, 다른 컴파일러는 단일 시스템에서 다른 크기의 int를 가질 수 있지만 포인터 크기는 시스템 유형 (8,16,32,64 비트)에 의해 정의됩니다.

0

인쇄 포인터 용입니다. 같은 방법으로 %d으로 플로트를 인쇄하지 않으면 포인터를 %d과 함께 인쇄하면 안됩니다.

0

0x2로하면 그 출력을

의 printf() 진수 포맷의 변수 A의 값을 출력 표시 왜 정수 단순히 2 의 진수 표현이다. 당신이의 주소를 인쇄 할 경우, INT의 같은 크기가 아닌 포인터의 다음

printf("%p",&a); 
0

당신은, 당신은 당신이 %d

printf("%d\n",ptr); 

%d

같이 사용 부호있는 정수에 대한 형식 지정자 경우 예상되는 결과

얻을

printf("%p\n",ptr); 

%p 포인터의 형식 지정자입니다 같이 %p를 사용 pointers (보통 8 바이트) 크기가 signed integers 크기와 다를 수 있으므로 예기치 않은 결과가 발생합니다 (일반적으로 4 바이트 es).

관련 문제