안녕하세요 궁금한게 있어서 질문드립니다.
union Box getBox() // Box 공용체를 반환하는 getBox 함수 정의
{
union Box b; // 공용체 변수 선언
b.candy = 10;
return b; // 공용체 변수 반환
}
이부분에서 함수밖으로 나가면 공용체 변수가 사라진다고 생각했는데 아닌건가요?
이것때문에 다음부분도 테스트를 해봤는데 잘 모르겠습니다;\
-----------
참고 | 구조체 변수의 메모리 주소 반환?
함수가 끝나면 구조체 변수도 사라집니다. 따라서 & (주소 연산자)로 구조체 변수의 메모리 주소를 반환하면 안 됩니다.
struct test* func(void)
{
struct test abc;
abc.aa = 3;
return &abc;
}
...
printf("%d\n", func()->aa);
비주얼베이직에서 테스트 해본결과 메모리 주소가 제대로 반환되는데 테스트를 잘못 한건가요?
테스트를 잘못한겁니다.
컴파일을 하면 하단 창에 경고 메시지가 표시될 겁니다.
warning C4172: 지역 변수 또는 임시: abc의 주소를 반환하고 있습니다.
즉, 컴파일은 되지만, 경고가 표시됩니다.
struct test abc에서 abc는 함수를 벗어나면 사라집니다. 함수 안에서만 범위(scope)가 유효한 지역 변수이기 때문입니다.
단, C 언어는 무효화되었다고 메모리를 정리하지 않습니다. 따라서 포인터를 사용한다면 여전히 그 주소에 접근할 수 있지만, 언제든지 다른 코드에 의해 덮어써질 수 있습니다. 이런 코드는 버그, 잠재적인 보안 위협을 만들 게 됩니다. 컴파일러 경고 메시지를 잘 봐주세요. 즉, 당장은 동작하는 것처럼 보이지만, 잘못 작성한 코드입니다.
C 언어는 메모리 관리를 전적으로 프로그래머에게 맡깁니다. 즉, 프로그래머가 변수의 유효 범위를 잘 인지하고 코드를 작성해야 합니다.
감사합니다.