[C] '지역변수의 포인터와 값 반환' 에서 헷갈리는 내용이 있습니다...!
글쓴이: 7979shin / 작성시간: 목, 2020/09/03 - 3:18오후
C언어를 공부하던 중에 다음과 같은 내용을 보았습니다.
. . . . . . . . . . . . . . .
int* function(void){ int i = 0; return &i; }
함수 function내의 지역변수인 i는
function이 return될 때는 이미 존재하지 않기 때문에,
i의 포인터 또한 반환이 불가능하다.
따라서 컴파일러는 다음과 같은 경고를 한다.
"function returns address of local variable'
(vs에서는 c4172)
. . . . . . . . . . . . . . .
그런데, 위의 함수에서
i의 포인터가 아니라 i의 값을 반환하면 오류가 나지 않습니다.
왜 i의 값을 반환할 때에는 오류가 나지 않는 것인가요??
Forums:
값은 복사하니까요. 그것이 쓰레기 값이라고 해도
값은 복사하니까요. 그것이 쓰레기 값이라고 해도 말이죠
------------------------------------------------------------
ProgrammingHolic
앗... 코드를 잘못 썼네요.
앗... 코드를 잘못 썼네요.
i를 초기화해야 했는데...
(현재는 수정하였습니다!)
그런데, 값이 복사된다는게 정확히 어떤 것을 일컫는 것인가요?
i의 값이 return문의 수식에 복사되는 것인가요?
return 문의 수식에 복사?
return 문의 수식에 복사?
이말이 무슨 말인지 모르겠네요
------------------------------------------------------------
ProgrammingHolic
C는 함수를 호출할 때 그 호출되는 함수로부터
C는 함수를 호출할 때 그 호출되는 함수로부터 건네받을 값을 보관할 공간을 스택(stack)에 잡아놓고 함수를 호출합니다.
return xxx; 라는 것은 그 잡아놓은 공간에 호출된 함수가 자신을 호출한 함수에게 전달할 값을 복사하는 동작을 의미합니다. 그 뒤에는 (assembly) ret가 실행되면서 자신은 스택에서 사라지죠.
return i; 라는 것은 i가 가지고 있는 값을 스택에 잡아놓은 영역에 복사하는 것이죠. 그 함수를 호출한 쪽에서는 그 함수를 호출한 후에 그 값(return value라고 하죠)을 가지고 계속 자신의 수행을 하게 됩니다.
return &i;는 전혀 문법에 위배되지 않지만 결국에는 없어질 스택 영역을 참조로 넘겨주는 것이기 때문에 결론적으론 잘못된 동작을 하게 되죠.
친절한 답변 감사합니다!!
친절한 답변 감사합니다!!
최근에 고민거리였는데... 해결되었습니다.
스택을 사용하는 아키텍쳐면 라스코니님의 답변처럼
스택을 사용하는 아키텍쳐면 라스코니님의 답변처럼 동작합니다.
만약 레지스터를 사용하는 아키텍쳐면,
리턴 시점에서 스택을 리셋하고요, (스택포인터를 함수 호출 이전으로 바꿈)
리턴 값은 레지스터에 복사 놓습니다.
함수를 호출한 쪽에서는 레지스터를 읽어서 리턴값을 가져갑니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
방식이 하나가 아니었군요!
방식이 하나가 아니었군요!
아직 배운게 별로 없어서 정확히는 모르겠지만,
왠지 동기부여가 되네요...
빨리 배워서 다 이해해버리고(?) 싶어요.
친절하게 답해주셔서 감사합니다!
댓글 달기