2012-01-03 6 views
3

가능한 중복 :
Returning the address of local or temporary variable
Can a local variable's memory be accessed outside its scope?무엇이 잘못 되었나요? 매달린 포인터?

#include<iostream> 
using namespace std; 

int *p = NULL; 

void 
fun(void){ 
    int i = 10; 
    p = &i; 
} 

int 
main(void){ 
    fun(); 
    cout<<*p<<endl; //#1 
    cout<<*p<<endl; //#2 
    return 0; 
} 

내가 # 1과 # 2가 출력이 동일한 생각하지만, 왜 # 1 출력 10 및 # 2 출력 임의 번호?

+5

파괴 된 스택 변수를 포인터로 가리키고 포인터를 역 참조하여 정의되지 않은 동작이 발생합니다. –

+1

예상되는 결과 (http://ideone.com/VMYzG) 또는 일부 다른 결과 (http://codepad.org/OiN8n1L0) – UncleBens

답변

8

이것은 정의되지 않은 동작입니다. 해당 변수가 범위를 벗어난 후 로컬 변수에 대한 포인터로 작업하고 있습니다. 어떤 일이든 일어날 수있다.

+0

그래서 # 1은 난수를 출력해야합니까? – bitstore

+2

@tinybit : "해야 할 것"이 무엇인지에 대해 추론하는 것은 무의미하다는 것을 깨달을 필요가 있습니다. ** 정의되지 않은 동작 **입니다. – unwind

+0

@tinybit : 특정 작업을해서는 안됩니다. "어떤 일이든 일어날 수있다". –

1

예, pfun()이 반환하는 매달린 포인터가됩니다.

1

범위를 벗어난 변수에 대한 포인터를 저장하고 있습니다. 따라서 behavior is undefined. 무엇이든 인쇄하거나 응용 프로그램을 충돌시킬 수 있습니다. 또는 컴퓨터를 폭발시킬 수도 있습니다.

3

이것은 실제로 매달리는 포인터입니다.

p에 자동 (로컬) 개체를 가리 키도록 지정합니다. fun이 반환되면 개체가 더 이상 존재하지 않고 p을 통해 액세스하려고하면 정의되지 않은 동작이 발생합니다.

특정 동작을 관찰하는 이유에 관심이있는 경우 : 대부분의 플랫폼에서 fun의 스택 프레임은 다른 함수가 호출 될 때까지 계속 존재합니다. 따라서 <<에 대한 첫 번째 호출에 대해 p을 읽으면 이전 값 i을 찾을 가능성이 큽니다. <<을 호출 한 후에는 이전 스택 프레임이 덮어 쓰기되었을 가능성이 높으므로 p을 읽으면 임의의 값을 찾을 수 있습니다. 그러나 이것 모두 당신이 의지 할 수있는 행동은 아닙니다. 죽은 객체에 액세스하면 충돌이 발생하거나 다른 동작이 발생할 수 있습니다. i 로컬 변수

int i = 10; 
p = &i; // This line 

때문에 :

+0

+1 가능한 출력 원인을 설명합니다. UB가 의지 할 수는 없지만, 효과를 인식 할 수 있어야합니다. – UncleBens

1

함수는 서면을 통해-얻는 뭔가에 대한 포인터를 반환합니다.

관련 문제