2017-09-11 13 views
4

다음 프로그램에서 ptr을 가리키며 초기화되지 않은 변수 x을 가리킨다. ptr을 인쇄하기 전에 10ptr으로 지정하여 인쇄하십시오.포인터가 초기화되지 않은 변수를 가리킨다

#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int x; 

    ptr = &x; 
    *ptr = 10; 

    printf(" x = %d\n", x); 
    printf(" *ptr = %d\n", *ptr); 
} 

모두 ptrx 인쇄 올바른 값. 하지만 의심 스럽습니다. 동작이 정의되어 있습니까?

+2

그것에 대해 읽어 보시기 바랍니다 것을 의미한다. 왜 그것이 정의되거나 정의되지 않을 것이라고 생각합니까? 당신의 연구 노력은 어디에 있습니까? 네가 이해하지 못했던 것을 어떻게 찾았습니까? 그것들을 추가하는 것은 좋은 질문입니다. –

+0

초기화되지 않은 변수의 _ 값에 액세스 할 때만 잘못 정의 된 동작을 호출 할 수 있습니다. – Lundin

+0

"역 참조하기 전에"ptr로, 나는 ptr에'10'을 할당하고 역 참조 해제한다는 의미를 설명해 주시겠습니까? ? 'ptr'을'ptr'에 할당하지 마십시오'ptr'은 역 참조입니다. 역 참조하기 전에 역 참조 하시겠습니까? – Gerhardh

답변

13

예, 그렇습니다. 유효한 값을 ptr에 할당 한 다음 간접 지정을 사용하여 유효한 값을 x에 할당합니다.

x과 같은 변수의 주소와 그 값은 별개입니다. 기억 장치가 할당 된 후에는 주소 값을 가져 오는 것이 변수의 값에 관계없이 항상 잘 정의됩니다.

+1

(포인터는 결코 어디에도 전달되지 않으므로 컴파일러가 *를 *로 여전히 최적화 할 수도 있습니다) –

+1

@ AnttiHaapala - 네, 그렇습니다. 아직 남아있는 코드의 동작은 어느 쪽이든 정의됩니다. – StoryTeller

1

제 생각에는 메모리에 쓰기 전에 메모리를 초기화 할 필요가 없으므로 동작을 정의했습니다.

1

예, x를 선언 할 때 자리 표시 자/메모리가 으로 제공 될 예정입니다.

ptr = &x; *ptr = 10; 코드를 효과적으로

x =10