2012-06-21 5 views
5

포인터 반환 :내가이 예 가능성이 작동하는 방법을 이해하지 못하는

double * GetSalary() { 
    double salary = 26.48; 
    return &salary; 
} 

main() { 
    cout << *GetSalary(); //prints 26.48 

} 

salary하는 GetSalary()에서 지역 변수이며, 따라서 함수에서 반환 한 후,이 세포는 아마도 다른 기능에 의해 덮어 쓸 수 있습니다. (힙에 인스턴스화되지 않은) 로컬 변수에 대한 포인터를 반환하는 것이 어떻게 작동하는지 알 수 없습니다.

+6

예, 덮어 쓸 수 있습니다. 그렇지 않을 수도 있습니다. 이것이 ** 보장 된 충돌이 아닌 ** 정의되지 않은 동작 **이라고 불리는 이유입니다. –

+0

구글이 "포인터 형태의 함수를 반환"했을 때 obove 코드가 첫 번째 결과라는 사실은 우스운 일이다. – user695652

+0

나는 종종 같은 것을 얻는다. Google 계정으로 SO에 로그인 할 때 Google이 검색 거품을 변경한다는 생각이 들었습니다. –

답변

16

작동하지 않습니다. 정의되지 않은 동작입니다. "올바른 행동"은 "가능한 모든 행동"의 하위 집합이기 때문에 효과가있는 것처럼 보일 수 있습니다.

8

의미가 정의되지 않은 동작으로 실행되고 있습니다. 즉, 이 발생하면이 발생합니다. 출근하는 것을 포함합니다.

외부 함수는 반환 포인터가 매달려 있습니다 (즉, 포인터가 가리키는 메모리가 유효하지 않습니다).

구현이 왜 효과가있는 것처럼 보입니까? 대부분의 경우 메모리는 지워지지 않습니다. 따라서 반환 포인터가 가리키는 포인터에 액세스 할 수는 없지만 해당 메모리에서는 26.48이 여전히 존재합니다. 그러나 그것은 단지 우연한 일입니다.

1

"작동하지 않습니다."더 이상 유효하지 않은 포인터를 역 참조합니다. 기대 한 가치를 지키기 위해 지적 된 기억은 전체적으로 "일하는"또는 올바른 것으로 나타나는 프로그램의 표시가 아닙니다.

왜 작동하는지 이해하려면 발생하는 스택 프레임 이동의 정확한 패턴을 분석해야합니다. 이는 성가신 일이며 매우 컴파일러에 의존합니다.

0

undefined behaviour입니다.
일부 시스템에서는 응용 프로그램이 손상 될 수 있으며 다른 시스템에서는 응용 프로그램이 올바르게 작동하는 것처럼 보일 수 있습니다. 그러나 어느 쪽이든, 당신은 그것을해서는 안됩니다.
this similar SO post을 참조하십시오. 기능 스택은 두 번째 함수 호출 dummy_function

2
double * GetSalary() 
{ 
    double salary = 26.48;  
    return &salary; 
} 
double dummy_function() 
{ 
    double a = 1.1; 
    double b = 2.2; 
    double c = 0 , d = 0; 

    c = a + b - d; 
    return c; 
} 

main() 
{  
    double *a; 
    a = GetSalary(); 
    cout << dummy_function(); 
    cout << *a; //this time it wont print 26.48 
} 

때문입니다. 멀티 스레드 프로그램에서는 제대로 작동하지 않습니다.

double * GetSalary() { 
    static double salary = 26.48; 
    return &salary; 
} 
0

이것은 또한 작동하지만, 훨씬 더 안전에 의해 덮어 쓴

관련 문제