[완료]아주아주 간단한 C 코드 질문입니다.

cheechyo의 이미지

C언어를 후배들한테 가르쳐주다가 이런 코드가 나왔는데,

#include        <stdio.h>
int sum(int a,int b)
{
        int buf = a+b;
}
main()
{
        printf("%d", sum(3,5));
}

보시다시피 함수에서 리턴을 지정해주지 않아도 printf문에서 출력이 8이라고 떡하니 뜨던데.. 이것은 어떻게 해서 이렇게 동작하는 것인가요? 궁금해서 잠도못잘지경입니다 ㅠㅠ

익명 사용자의 이미지

코드상에 명시적으로 return 을 적어주지 않았어도
sum() 함수를 작성할때 리턴타입을 int 로 적었으니
마지막 계산결과인 int buf 값이 자동으로 리턴되었을것 같네요.

익명 사용자의 이미지


몇가지 코드를 수정해 보면서 실험한 결과는 아래와 같습니다.

void sum(int a, int b)로 바꾸면 컴파일 에러납니다.

sum(int a, int b)로 바꾸면 컴파일 되고, 리턴값도 8로 들어오는군요.

gurugio의 이미지

sum함수가 3+5를 계산하기위해서 스택에 8을 저장했을 수 있구요
printf가 호출되면서 출력할 값을 스택에서 꺼냈는데 보통 스택에 있는 쓰레기값이 나올텐데
어쩌다보니 sum함수가 8을 저장한 스택 위치에서 값이 꺼내진것 같습니다.

디스어셈블해보면 정확하게 알 수 있지만 컴파일러나 옵션에 따라서 되기도하고 안되기도 할것 같습니다.
성능 옵션을 올려보시면 아마 값이 달라질거에요.

alice79의 이미지

컴파일러마다 다르지만 보통 return문을 명시하지 않으면 반환값을 넣어둘 예정으로 있던 레지스터의 값을 반환합니다.

그 과정에서 sum 함수의 연산 도중값이 들어있는 경우가 많기 때문에 buf의 내용이 리턴된 것입니다. (항상 그런 동작이 보장되지는 않음.)

kgcrom의 이미지

http://stackoverflow.com/questions/4644860/function-returns-value-without-return-statement

http://stackoverflow.com/questions/6638963/checking-return-value-of-a-function-without-return-statement

잘 모르지만,
검색을 통해 학습한건, EAX라는 레지스터때문이라는것 하나.

"If a return statement without an expression is executed, and the value of the function call is used by the caller, the behavior is undefined. Reaching the } that terminates a function is equivalent to a return statement without an expression."

정의된거다..라는것 하나네요.

요새 ruby하고있는데
작성하신 코드보고, "응? 당연한거아닌가?" 라는 생각을했네요...ㅋㅋ

흘러가고있는 지금 이 시간에 충실하자.

익명 사용자의 이미지

여러번 얘기하지만 undefined behavior에 대해서는 고민할 필요가 없습니다.

해당 undefined behavior에 대해 나올 수 있는 얘기들은
그냥 저마다 짐작을 얘기하는 것뿐이지 정답이 있는 것도 아닙니다.
그게 영어로 적혀있던 한글로 적혀있던 정답이 아닙니다.

더군다나 실제로 사용하는건 금물.

cheechyo의 이미지

댓글 감사합니다. 많은것을 배우고 가네요.

글에는 깜빡하고 못썼지만 gcc에 std 옵션으로 어떤것을 넣어도 경고문이 뜨지 않아 질문하게 되었었습니다.

안녕하세요,
고맙습니다.

익명 사용자의 이미지

-Wall 옵션을 주고 컴파일한 결과입니다.

X.c: In function ‘sum’:
X.c:4:13: warning: unused variable ‘buf’ [-Wunused-variable]
X.c: At top level:
X.c:6:1: warning: return type defaults to ‘int’ [-Wreturn-type]
X.c: In function ‘main’:
X.c:9:1: warning: control reaches end of non-void function [-Wreturn-type]
X.c: In function ‘sum’:
X.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]

댓글 달기

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