문자열을 리턴 하려면..

익명 사용자의 이미지

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'
이렇게 나옵니다... 문자열을 리턴 하려면 어떻게 해야하나요??

익명 사용자의 이미지

...... 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가 없는데..
아무튼 코드상에 별 무리는 없으나.. 묻기위해 임의로 만든 코드라서 그런
지 ^^*

익명 사용자의 이미지

우선 함수 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'
이렇게 나옵니다... 문자열을 리턴 하려면 어떻게 해야하나요??

익명 사용자의 이미지

...... 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 시키는것 잊지 마시고요. ^^

즐거운 프로그래밍 하세요~~~

익명 사용자의 이미지

변수 선언이 잘못되었다는 앞 사람들의 답변도 중요한 말이지만,
질문자가 물어본건 컴파일시 나온 에러 메시지의 내용 아닌가요? ㅋㅋㅋ

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 메시지잖아요.

쩝...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.