2007년 05월 29일
C - 스트링을 리턴값으로 넘겨주기.
일단 결론부터 말하자면
char *function(); 이런식으로 정의해서 포인터 값을 넘겨줘야 한다.
예를들어 function 함수내에서 도출해낸 결과를 배열에 때려넣든 해서 그것을
넘겨줘야하는데 예를 들어서..
char* function()
{
char b[100];
char *p;
p=b;
...
..
return p;
} 라는 식으로 정의했다고 치자.
만약에 p를 다른 함수에서 받은 후에 또다른 .. 배열을 레퍼런스하는 포인터로 받았다 치자
그런후에 strcpy를 쓰든 해서 복사를 하면.. 되긴 되는데
지역변수나, 일시적인 주소를 리턴했다고 error가 아닌 warning이 뜨게 된다.
문제는 스택공간에 있는데 메모리상에 올라왔던 function 함수가 배열자체를 인자로 통째로
넘겨줄수 없기 때문에 함수가 리턴되면서 함수 자체가 메모리상에선 더이상 상관안하는 녀석
즉, NULL로 바뀌지만 않은 언제 어디서든 변화가 될 수 있는 매우 위험한 상태가 되버리기 때문이다.
정리하자면.. 메모리상에 올라온 다른 함수는 스택 공간에 올라와있다가 리턴되면서 사라지므로
억지로 참조하면 되긴 하지만 역시 매우 위험한 일이란거. -ㅂ-;
그러니까 해결하는 방법은 malloc을 써서 메모리 할당 후에 포인터를 넘겨주어
값을 레퍼런스하는 수 밖에 없단말이다.
char *function(); 이런식으로 정의해서 포인터 값을 넘겨줘야 한다.
예를들어 function 함수내에서 도출해낸 결과를 배열에 때려넣든 해서 그것을
넘겨줘야하는데 예를 들어서..
char* function()
{
char b[100];
char *p;
p=b;
...
..
return p;
} 라는 식으로 정의했다고 치자.
만약에 p를 다른 함수에서 받은 후에 또다른 .. 배열을 레퍼런스하는 포인터로 받았다 치자
그런후에 strcpy를 쓰든 해서 복사를 하면.. 되긴 되는데
지역변수나, 일시적인 주소를 리턴했다고 error가 아닌 warning이 뜨게 된다.
문제는 스택공간에 있는데 메모리상에 올라왔던 function 함수가 배열자체를 인자로 통째로
넘겨줄수 없기 때문에 함수가 리턴되면서 함수 자체가 메모리상에선 더이상 상관안하는 녀석
즉, NULL로 바뀌지만 않은 언제 어디서든 변화가 될 수 있는 매우 위험한 상태가 되버리기 때문이다.
정리하자면.. 메모리상에 올라온 다른 함수는 스택 공간에 올라와있다가 리턴되면서 사라지므로
억지로 참조하면 되긴 하지만 역시 매우 위험한 일이란거. -ㅂ-;
그러니까 해결하는 방법은 malloc을 써서 메모리 할당 후에 포인터를 넘겨주어
값을 레퍼런스하는 수 밖에 없단말이다.
# by | 2007/05/29 13:05 | STUDY | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]