2017-02-08 4 views
-1

은 "% p 나"의 printf :이 출력이 코드가 매개 변수

#include <stdio.h> 
#include <string.h> 

void main(){ 
     printf("%p"); 
} 

: 예로 사용하는 경우 0x7ffdd9b973d8

내가 포인터 %p 스탠드를 알고 및

#include <stdio.h> 
#include <string.h> 

void main(){ 
int i = 0; 
printf("%p", i); 
} 

i의 포인터 주소를 반환합니다. 하지만 내 질문은

printf("%p"); 

단지 printf("%p")

+9

'printf ("% p", i);''i '의 주소를 출력하지 않습니다. 당신은 그것을 위해'의 printf ("% p를", (무효 *) &i);을'필요 했어. – AnT

+1

을 내가 생성에있는대로, 잘. 무작위되지 메모리에 임의의 주소이라고 생각하지만 예측 직접. 기본적으로 쓰레기. – Cullub

+2

를 @ 개미 당신은'(void *)'가 필요합니까? – Cullub

답변

4

휴지통. printf은 가변 길이 인수 목록을 사용합니다. 형식 문자열을 사용하여 실제로 전달한 인수의 수를 결정합니다. 실제로 아무것도 전달하지 않았다면, 마치 당신이했던 것처럼 여전히 기본적으로 임의의 부분에서 읽혀질 것입니다. 결과는 정의되지 않거나 휴지통입니다. 기능의 printf 가족이 그렇게 인기가 있기 때문에

어떤 컴파일러는 경고와 함께이 상황을 잡을 수있을 것입니다. 함수가 액세스 할 수없는 메모리에서 읽기를 시도하면 시스템에 장애가 발생할 수 있습니다. 특정 결과를 얻었더라도 다음 번에 어떻게 작동 하는지를 알 수있는 방법이 없습니다.

4

동작은 정의되지 않은 printf 함수에 다른 인수를 추가하지 않을 경우 반환하지 것입니다. 형식 문자열에 %p 형식을 지정하면 void * (또는 char *) 유형의 해당 인수가 인수 목록에 있어야합니다.

+1

나는 OP가 그 규칙이 어떻게 시행되는지를 묻고있다. –

+0

MadPhysicist가 맞습니다. –

+0

@Mad 물리학 자 : 나는 그것을 보지 않는다. 질문은 인쇄 된 쓰레기와 그 출처에 관한 것입니다. – AnT

4

하지만 내 질문은 printf 함수에서 다른 인수를 추가하지 않을 때 무엇을 반환합니까? printf ("% p");

아무것도. 아무것도. 임의의 쓰레기. 어쩌면 충돌 할 수 있습니다.

등등에는 컴파일러, CPU, 플랫폼, 도서관, 실행 환경의 특정 조합을 조사하지 않고 알 수있는 방법, 그리고이 없습니다. 특정 방식으로 작동하도록 요구하는 규칙은 없습니다.