warning: function returns address of local variable

lemonday의 이미지

다음과 같은 코드로 실행을 해보니

char *kkk(char *mm)
{
char abc[100];

strncpy(abc,mm,100);
return abc;
}

int main()
{
char *mm = "abc";

printf("%s\n",kkk(char*)mm));

return 0;
}

함수 kk에서 return abc 에 warning: function returns address of local variable
이런 warning이 뜨내요.
또한 출력문 역시 원치 않는 값이 출력됩니다.

이유를 알고 싶습니다.

godyang의 이미지

안녕하세요?

kkk 함수 내에 선언된 abc[] 변수는 Local Variable입니다.
즉, 스택에 선언되므로 함수 내에서만, 또는 서브 함수 내에서만 유효합니다.

따라서 리턴되면 스택이 Pop되므로, abc의 내용이 다른 요소에 의해 Overwrite될 수 있습니다.

해결책은 malloc과 같은 메모리 할당 프로그램을 이용해서 Heap에 메모리를 할당하거나, static이나 extern 변수를 쓰시면 됩니다.

그럼...

익명 사용자의 이미지

음, 제가 쓰는 사이 다른 분이 이미 답변을 해주셨네요. 8)

한가지 중요한 것은 이 문제를 피하기 위해 전역 변수를 쓰는 것은 대부분의 경우 안좋은 프로그래밍 습관이란 점입니다. 가능한한 동적 할당으로 해결하는 것이 좋습니다.

alfalf의 이미지

저는 위와 같은 경우에 processing한 결과 문자열을 strdup 함수를 써서
문자열을 새로운 공간에 할당한 후 그 포인터를 리턴해서 사용하고
나중에 사용이 끝나면 free()로 해제 시킴니다.

추신) 제 방법이 맞는 건가요? ^^:

B00m의 이미지

alfalf wrote:
저는 위와 같은 경우에 processing한 결과 문자열을 strdup 함수를 써서
문자열을 새로운 공간에 할당한 후 그 포인터를 리턴해서 사용하고
나중에 사용이 끝나면 free()로 해제 시킴니다.

추신) 제 방법이 맞는 건가요? ^^:

이 방법은 별로 좋은 방법은 아닙니다.

메모리를 잡고 해제하는 것은 같은 루틴 안해서 하는 것이 좋습니다.

그래야 코드가 좀 더 깔금해 지고 나중에 수정도 쉽습니다.

저같으면 꼭 이렇게 써야 하는 경우라면 그냥 static 으로 잡아 쓰겠습니다.

일반적으로는 이런 경우 인자로 버퍼도 같이 넘겨 주는 것이 좋습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.