문자열을 리턴 하려면..
글쓴이: 익명 사용자 / 작성시간: 금, 2002/05/17 - 2:30오후
main()
{
char* ccc;
ccc = aaa();
}
char* aaa()
{
char* bbb;
bbb = "test";
return bbb;
}
위와같이 코딩하면.. 틀린건가요?? 전 나름대루 맞다고 생각하구 했는데.
컴파일 하면..
In function `main'
warning assignment makes pointer from integer without a cast
At top level
warning type mismatch with previous implicit declaration
warning previous implicit declaration of `ttt'
warning `ttt' was previously implicitly declared to return
`int'
이렇게 나옵니다... 문자열을 리턴 하려면 어떻게 해야하나요??
Forums:
Re: 문자열을 리턴 하려면..
...... wrote..
main()
{
char* ccc;
ccc = aaa();
}
char* aaa()
{
char* bbb;
bbb = "test";
return bbb;
}
위와같이 코딩하면.. 틀린건가요?? 전 나름대루 맞다고 생각하구 했는 데.
컴파일 하면..
In function `main'
warning assignment makes pointer from integer without a cast
At top level
warning type mismatch with previous implicit declaration
warning previous implicit declaration of `ttt'
warning `ttt' was previously implicitly declared to return
`int'
이렇게 나옵니다... 문자열을 리턴 하려면 어떻게 해야하나요??
첫벗째 워닝은 일단 gcc에서..
main은 int형입니다.
즉 int main()
으로 바꾸시고 마무리를 exit(0);나return 1이런식으로 추가해주십시오.
그리고 두번째 warning은 ttt에 대한 변수 정의에 대한 워닝인데여??
코드상에 ttt가 없는데..
아무튼 코드상에 별 무리는 없으나.. 묻기위해 임의로 만든 코드라서 그런
지 ^^*
Re: 심각한 오류입니다.
우선 함수 aaa()에 정의된 변수 bbb는 지역변수로서 해당 block이
종료되면, 즉 함수가 return되는 시점에 stack영역에서 없어지는
변수입니다. 그런데 메모리에서 사라진 변수의 값을 main() 함수에서
변수 ccc에 저장한다는 야그가 되는 거죠.
물론 완전히 사라지는건 아닙니다. 그래서 짧은 program에서는
잘 동작합니다.
그런데 함수 aaa()가 return된 후 그 stack 영역에 다른 함수가 자리잡게
되면 심각한 run-time 오류가 발생합니다.
...... wrote..
main()
{
char* ccc;
ccc = aaa();
}
char* aaa()
{
char* bbb;
bbb = "test";
return bbb;
}
위와같이 코딩하면.. 틀린건가요?? 전 나름대루 맞다고 생각하구 했는 데.
컴파일 하면..
In function `main'
warning assignment makes pointer from integer without a cast
At top level
warning type mismatch with previous implicit declaration
warning previous implicit declaration of `ttt'
warning `ttt' was previously implicitly declared to return
`int'
이렇게 나옵니다... 문자열을 리턴 하려면 어떻게 해야하나요??
Re: 문자열을 리턴 하려면..
...... wrote..
main()
{
char* ccc;
ccc = aaa();
}
char* aaa()
{
char* bbb;
bbb = test;
return bbb;
}
char* aaa()
{
char* bbb;
bbb=(char*)malloc(sizeof(char)*BUF_SIZE);
strncmp(bbb, "test", 4);
return bbb;
}
코드를 이렇게 바꾸어 보세요.
위에서 다른분이 답변을 하셨듯이 지역변수는 아주 일시적으로만 사용할
수 있습니다.
하지만 지역변수도 지역변수 나름. ^^;;
지금 원래 코드로는 포인터가 실제 메모리를 할당받지 않았기 때문에..
메모리의 어느 부분을 사용할지 몰라요.
그 말은 시한폭탄을 가지고 있는 변수라고 생각해도 된다는 말이 되는 것
이죠.
어떨땐 동작을 하기도 했다가 어떨땐 동작을 안하고.. 막 이런 현상이 나
타날 수 있어요.
(즉, 세크먼트 폴트가 나냐 마냐..)
포인터는 확실하게 메모리 할당을 해주어야만 하고, 그렇지 않으면 문제
가 발생하죠.
(포인터를 처음 공부할때 이 문제때문에 많이 고생하죠 ^^;;)
암튼, 이렇게 heap영역에 메모리를 할당해 주게 되면은 리턴을 시켜도 사
라지지가 않죠.
문론 bbb라는 변수는 지역변수이므로 사라지지만, 대신 bbb가 가르키고 있
던 heap영역의 메모리는 유지되죠.
그럼 main함수에서는 그 메모리를 넘겨받는 것이죠.
(이 넘겨줄때 사용하는 변수는 임시 변수로써 내부적으로 처리를 해줍니
다.
우리가 신경써야할 부분은 아니고, 다만 한 라인내에서만 존재를 하게 되
는 변수이죠.
그니깐 이점은 유념하시고..)
암튼. 가장 큰 문제는 메모리를 할당시키지 않았다는 것입니다. ^^
그리고 나중에 free 시키는것 잊지 마시고요. ^^
즐거운 프로그래밍 하세요~~~
Re: 문자열을 리턴 하려면..
변수 선언이 잘못되었다는 앞 사람들의 답변도 중요한 말이지만,
질문자가 물어본건 컴파일시 나온 에러 메시지의 내용 아닌가요? ㅋㅋㅋ
char *aaa()를 main() 위에다 적으세요.
그럼 되겠네요.
실제 컴파일 시에는 함수명이 aaa()가 아니라 ttt()였나 보군요. ㅋㅋㅋ
에러 메시지 내용을 볼까요?
In function `main'
warning assignment makes pointer from integer without a cast
At top level
warning type mismatch with previous implicit declaration
warning previous implicit declaration of `ttt'
warning `ttt' was previously implicitly declared to return `int'
main()
{
char *ccc;
ccc = aaa();
}
main()에서 aaa()를 호출했지만 aaa()는 그 뒤에 나와있으니
컴파일러가 파싱하면서는 모르죠.
그러면 aaa()는 int를 리턴한다고 가정하죠.
그런데 char* ccc에다가 리턴값을 대입했으니
warning assignment makes pointer from integer without a cast 이게 나온 겁니다.
(이걸 보고 아래 chori님은
main()의 프로토타입을 int main()으로 바꾸라고 답을 했더군요. ㅋㅋㅋ)
그 다음 나온 에러 메시지
warning `ttt' was previously implicitly declared to return `int' 를 보면 확실히 알 수가 있겠죠?
"ttt()는 (여기서는 aaa()가 되겠죠) 이전에 이미 묵시적으로 'int'를
리턴하는 걸로 선언되어 있었다"
라는 컴파일 warning 메시지잖아요.
쩝...
댓글 달기