임시? 복사본의 개념

조회수 629회

이미지

getdata라는 함수가 호출되고 return 문을 통해 temp가 리턴 되어지는데

temp는 getdata라는 함수 내부의 struct simple 타입의 지역변수입니다. 따라서 지역변수의 특성상

함수가 호출되고 값을 반환하게 되면 사라지게되는데 ( 배운 지식대로는 )

그러면 s라는 변수를 초기화 시킬수 없으니 temp의 복사본이 메모리 어딘가에 생성되고 그 복사본으로 s라는 변수를 초기화하는 방식인가요 ? 그렇다면 그 temp의 복사본은 s라는 변수를 초기화 시킨 후, 바로 사라지는건가요 ?

일반화 하면 함수의 반환으로 바로 어떤 변수를 초기화 할 경우는

메모리 어딘가에 복사본이 생기고 그 복사본으로 변수를 초기화시키는건가요 ?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 사실 질문자의 궁금증을 해소하는 제일 좋은 방법은 어셈블리어를 학습하고 c가 생성한 어셈블리 코드를 보고 이해하는 것 입니다.

    물론 여기에는 스택프레임이라는 것을 먼저 이해해야 하고 스택프레임을 이해하면 함수를 빠져나올경우 지역변수가 왜 초기화 되는지 알 수 있습니다. 즉 변수 scope 을 이해하는데 필수 지식이 스택프레임이라고 할 수 있습니다.

    그러면 지역변수의 구조체를 리턴 받는건 왜 가능한가?

    일단 언어적으로는 구조체의 포인터를 리턴하는 것이 아닌 값을 리턴하기때문에 가능한 것이고(지역 변수 포인터를 리턴하면 질문자가 알고 있는 대로 오류입니다) 원리는 함수를 리턴하면 eax 라는 레지스터에 리턴값을 저장하게 되는데 구조체의 값을 함수 scope 밖에 복사시키고 그렇게 복사한 구조체의 주소를 eax에 넣어줍니다.

    즉 eax에는 구조체의 첫번째 요소(필드)의 주소가 저장되어 있어 스택프레임이 정리가 되도 문제가 없는 것 입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)