[질문] return에 대한 매우 기초적인;; 질문
글쓴이: icabord / 작성시간: 수, 2008/03/19 - 5:44오후
안녕하세요. 질문 올립니다.
우선 허접한 소스를 올려보면
char *GetStr(char *);
int main(void)
{
char result[100];
sprintf(result, "%s", GetStr());
printf("result : %s\n", result);
return 0;
}
char *GetStr(void)
{
char a[100] = "good ";
char b[100] = "test";
sprintf(a, "%s%s", a, b);
return a;
}
다음과 같습니다.
GetStr 함수에서 얻은 배열의 포인터를 리턴하여 main 함수에서
다른 변수에 copy하여 출력하는 예제입니다.
궁금한 것은 분명 함수의 경우 리턴하면 기존의 지역변수는 날아간다(?)고 알고 있는데
제대로 출력이 됩니다.
main 시점에서 copy를 하려고 해도 그 주소의 값이 유효하다는 보장이 없는데, 어떻게 가능한 것인지와
현재는 가능하더라도 중간에 포인터가 가리키고 있는 값의 변경이 있다면 문제가 되는지,
실제 함수 종료후 값이 어떻게 반환되고 초기화 되는지 궁금합니다.
답변 부탁드립니다.
Forums:
프로토 타입 오타는 무시해 주세요 -_-;;;
.
컴파일러와 환경에
컴파일러와 환경에 따라 다를수 있으며
100% 반드시 잘 된다는 보장이 없습니다.
함수 반환후 지역변수들은 영역이 해제된 스택영역에 남아있으며
이 스택영역이 무사하면 아마 무사히 데이터를 쓸수있으나 보장할수 있는 자료가 아닙니다.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
지역변수를
지역변수를 사용함수가 사용한후 리턴될때 메모리에서 없어지는것은 아니지요.
단지 스택 포인터만이 움직일뿐 그 메모리위치에 다른값이 덮어쓰워 질때까지는
그대로 그값이 있는겁니다. 어셈블리어와 스택포인터에 대해 배워보세요.
..
답변 감사합니다.
.
친절하신 컴파일러가 봐주는 겁니다.
깐깐하신 컴파일러를 써보시면 바로 error .............
컴파일러 옵션에도 아마 먼가 있는 .. 기억이 .. 죄송.
===================================================
Make it Simple, Easy, Compact !!!!
댓글 달기