본문 바로가기

Programming/C/C++/CS

지역 변수 또는 임시 변수의 주소를 반환하고 있습니다.

원본 : http://www.gpgstudy.com/forum/viewtopic.php?t=5454

 

 

 

warning C4172: 지역 변수 또는 임시 변수의 주소를 반환하고 있습니다. 

대충 코드는 아래와 비슷한 상황입니다. 

코드:
int* Func()
{
    int asdf = 100;
    return &asdf;
}


제가 생각해도 좀 찜찜해서 고치려고 했는데 
막상 테스트 해봐도 값을 반환하는데 문제가 없었습니다. 
그래서 더 찜찜했습니다. ㅡㅡ; 
단지 포인터가 아니어서 임시변수의 주소를 반환할때 문제가 안생기는걸까요? 
정확히 문제가 생길수 있는 상황이 언제인지를 알고싶습니다.

 

 

////////////////////////////////////////////////////////////////////////////////////

 

 

말 그대로 임시객체라서, 그 포인터가 가리키는 것이 무엇일지 장담할 수 없다는 것이 문제입니다.

 

 

정확히 언제 문제가 생길지 알 수 없다는 게 문제입니다  

간단한 테스트로는 문제가 드러나지 않을 수 있지만 여러 함수들이 계속 호출되어서 스택이 바뀌면 언젠가는 저 주소에는 다른 어떤 값이 들어가게 될 것입니다

 

 

------------------------------------------------------------------------------------

 

 

릴리즈나 디버그모드의 차이와는 관계없이, 스택이란 녀석의 동작원리를 알고 있다면 저런 코드가 어떤 문제점을 가지고 있는지를 확인하는것은 그리 어렵지 않습니다.  

코드:
#include <stdio.h>

int* Func1()
{
       int asdf = 100;
       return & asdf;
}

int* Func2()
{
       int asdf = 101;
       return & asdf;
}

int main( int c, char *v[] )
{
  int *a1, *a2;

  a1 = Func1();
  a2 = Func2();

  printf( "0x%08x, 0x%08x, %d, %d\n", a1, a2, *a1, *a2 );
}
a1 과 a2 가 가리키는 주소는 동일하며 결과는 101, 101 이 됩니다. 물론 포인터가 아닌 값을 반환한다면 문제는 없습니다.