게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
함수 반환을 참조자로 쓸 때(?)의 메모리 주소값 관련 질문입니다.
게시물ID : programmer_13517짧은주소 복사하기
작성자 : 죠죠팸
추천 : 0
조회수 : 438회
댓글수 : 3개
등록시간 : 2015/09/25 11:01:35
옵션
  • 베스트금지
  • 본인삭제금지
안녕하세요. 요즈음 C/C++언어를 학습하고 있는 중입니다.
참조자와 new, delete 함수에 관해 공부하던 와중에 궁금한 점이 발생하여 이렇게 질문드립니다.

tmp1.png

 위의 스크린샷의 코드는 학습 중에 의문이 생겨서 변경한 코드입니다.
 본래 위 코드의 목적은 구조체 Point, 두 개의 좌표값을 더한 값을 반환하는 Pntadder로 두 개의 좌표 값을 더하고 그것을 화면상에 띄우는 목적의 프로그램입니다.

 다만 프로그램에서 제한했던 내용이 두가지 있습니다.

typedef struct __Point
{
int xpos;
int ypos;
} Point;

Point & Pntadder(const Point &p1, const Point &p2);

 위 두개를 무조건 써야된다고 했습니다(물론 이게 효율적이다라는 이야기가 아니라 교육적인 측면에서 그런겁니다)


 std::cout << &refpos.xpos << ' ' << &refpos.ypos << std::endl;

 참조자라는건 결국에 변수를 저장하기로 약속한 메모리 공간에 새로운 이름을 약속하는 것으로 이해하고 있는데요.
 
 Point & Pntadder에서 tmp 변수를 생성할 때 tmp는 스택 영역으로 들어가고 본래는 함수를 빠져나갈때 소멸하는 것으로 알고 있습니다.
 그렇지만 값을 반환 받을 때 이것을 참조자로 받았는데 tmp.xpos, tmp.ypos의 메모리 주소값과 refpos.xpos, refpos.ypos의 메모리 주소값이 동일한 결과가 나왔습니다.

 위의 코드에서는 포함이 되지 않았는데

Point & refpos2 = Pntadder(*ptr1, *ptr2);
std::cout << &refpos2.xpos << ' ' << &refpos2.ypos << std::endl;

 참조자 refpos 외에 새로운 참조자를 refpos2를 만들어서 Pntadder의 반환값을 받도록 했는데요

 첫번째로 함수에 들어갈 때의 tmp의 메모리 값, 두번째로 함수에 들어갈 때의 tmp의 메모리 값, 참조자 refpos, refpos2의 주소값이 모두 동일하게 나왔습니다.

tmp2.png



 이야기가 좀 길어졌는데 그래서 결국 질문은 이하와 같습니다.

1.Point tmp;로 선언한 이 변수의 정체는 무엇인가?
 함수를 호출하고 Point tmp;를 할때 이 변수는 스택 영역에 생성된다고 알고 있습니다.
 스택 영역은 생성 후 함수를 빠져나올 때 지워지는 것으로 알고 있는데요. 이는 참조자의 존재와 모순됩니다.
 함수의 반환값을 참조자가 받을 수 있도록
 Point & Pntadder(const Point &p1, const Point &p2); 이런식으로 할 경우 스택 영역이 아닌 다른 영역에 생성되는 건가요? 아니면 스택 영역이지만 예외취급을 하는겁니까?

2.첫번째 호출 이후 함수 Point는 refpos에 종속(?)되는가?
 refpos, refpos2의 주소값이 동일하게 나왔다고 말씀드렸습니다.
 제가 아는 함수의 정의로는 tmp(첫번째로 호출할 때)와 refpos / tmp(두번째로 호출할 때)와 refpos2가 주소값이 동일한건 그냥 그러려니 납득할 수 있습니다만, 참조자 두개의 주소값이 똑같은 것은 조금 이상하네요.
 참조자 refpos가 함수 Point로 부터 반환값을 반환 받을 때 함수 Point가 참조자 refpos에 종속되게 되는건가요?


 질문글을 처음 쓰려니까 너무 힘드네요.
 긴글 끝까지 읽어주셔서 감사합니다.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호