c언어 함수 return value시 메모리 처리

poiq1의 이미지

안녕하세요.

c언어 함수 리턴값에 대해서 궁금한게 있어서 이렇게 글을 작성하였습니다.

아래 함수는 간단한 합계를 계산하는 함수 입니다.

int sum(int a, int b)
{
int sum = 0;
sum = a + b;
return sum;
}

int main()
{
printf("sum : %d", sum(10,10);
}

sum 변수는 스택에서 할당된 메모리 이므로
함수를 빠져나갈 때 스택 영역이 파괴되어 sum 변수는 더 이상 사용할 수 없습니다.
따라서 리턴 후 sum의 값인 20이 저장된 메모리를 쓸 수 없지만

여기에서 제가 알기로는
return value에 한해서 sum 주소를 일시적으로 보호(?)한다로 알고 있는데요..
아니면 임시 메모리에 보관 후 리턴 처리 후 파괴인지...
정확한 개념이 정립되지 않아 혹시 어떤 방식으로 처리 되는지 궁금합니다.

답변 미리 감사드립니다.(__)

ifree의 이미지

함수에서 리턴 값을 스택에 쌓고, 호출 장소로 돌아오게 되며, 호출한 측에서는 스택 상의 값을 꺼내어 사용하고 스택 포인터를 변경하게 됩니다.

나빌레라의 이미지

이론적으로 스택을 사용하다가 맞지만 실제 구현은 다릅니다. 예를 들어 ARM은 레지스터를 사용해서 리턴을 처리하기도 합니다. 옵션에 따라 레지스터를 쓰지 않을 때도 있습니다. 따라서 무조건이라고 생각하시면 안되고 컴파일러의 구현과 타겟 아키텍쳐에 따라 다르다고 생각하시면 됩니다.

예를 들어 본문의 간단한 sum() 함수에서 파라메터 a, b는 스택이 아니라 레지스터 R0, R1로 전달받고, sum도 스택이 아니라 R2일 수 있습니다. 그리고 리턴하기 직전에 R2를 R0에 복사하고 함수는 끝납니다. 호출하는 쪽에서도 R0을 읽어서 결과를 받지요.

이렇게 레지스터가 있는 아키텍처이고 함수가 충분히 작으면 아예 스택을 쓰지 않기도 합니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

swish95의 이미지

윗분들이 너무 전문적인 답글을 달아주셨네요

전 초보니까 초보적으로..ㅋㅋ
개념적으로는 sum 함수가 실행되고 나서 해당 결과를 반환 받는 겁니다.
sum 함수의 내부에 있는 변수들은 함수 실행이 끝나면 사라지고 해당 값만 복사되서 넘어오는거죠
해당 값은 printf 함수에 인자로 넘어가면서 임시변수로 할당된다고 보시는게 맞겠네요

------------------------------------------------------------
ProgrammingHolic

댓글 달기

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