c언어 return 0

dltmddnr0113의 이미지

c언어 초보자라 잘몰라서 질문 좀 하겠습니다^^

#include <stido.h>
int main(void)
{
    printf("hello world");
 
    return 0;
}

에서 return 0; 이랑 return;이랑 뭐가 다른가요?? 디버깅 하니깐 똑같이 작동하던데 정말 궁금해요.... 0 이 왜 있어야되는지 왜 0이 없어도 똑같이 작동 되는지 잘모르겠어요

hoochoona의 이미지

정확하게 알아보지 않아서 말씀드릴 순 없으나,

int를 반환하는 함수에 return; 나, return 자체를 쓰지않으면 경고가 발생합니다.
컴파일 옵션에 따라 경고를 무시할 수 있는데, 무시하게되면 int형 반환 함수는 자동으로 0을 반환하게 됩니다.

보통 return;는 void형 함수에서 함수를 종료하고 싶을 때 사용합니다.
당연히 void형 함수는 반환 값이 없기 때문에 적지 않아도 되구요.

되도록이면 int형 함수에선 제대로 반환 값을 적어주는 편이 좋습니다.

-----------------------------
안녕하세요. 후추나입니다.
http://blog.naver.com/chhh92
...
실패는 좋은 경험치.

jic5760의 이미지

예를들어 리눅스 데몬으로 실행되는 프로그램을 만들 때..
service sshd start 을 하면 정상 실행되면 Success가 나타나고 그렇지 않으면 Fail이 뜹니다.
데몬의 실행 여부는 바로 이 return 값을 통해 알 수 있습니다.

이런 예시처럼 리턴값을 이용해 프로그램 종료 후 따로 처리를 할 때에는 리턴값이 필요합니다.
하지만 그렇지 않다면 어떠한 리턴값도 실질적인 의미는 없습니다.

그리고 return 0을 하는 이유는 대부분의 상황에서 0은 오류없음 을 의미하기 때문입니다.

devace의 이미지

저도 갑자기 궁금해져서 찾아 보면서 답변 달아 봅니다.

함수의 return은 상위의 caller에게 값을 전달하는 의미와 해당 함수를 종료하는 의미가 있지 않겠습니까.

main함수의 return역시 main함수의 종료와 main 함수를 호출한 caller에게 값을 전달할 것입니다.

main함수의 호출과 종료는 process의 생성과 소멸을 의미 합니다.

process가 생성되면, main함수가 호출 되므로 main함수의 caller는 parent process가 됩니다.

(모든 프로세서는 단 하나의 첫번째 프로세서 이외에는 다 부모 프로세스가 있습니다.)

따라서 main 함수 종료시 해당 process를 생성한 부모 process에게 결과값을 전달하는 목적으로 사용되며,

C언어 표준에 따라 프로세서 동작이 이상이 없을때 0, 이상이 있을때는 0이 아닌 숫자를 반환하는데.

이것은 운영체제 마다 상이할수 있고 정하기 나름인것 같습니다.

이렇게 프로세스의 실행 결과 값을 리턴하는 값이 exit status 라고 합니다.

https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/exit-status.html

process의 종료와 함께 process를 생성해준 부모 process에게 값을 전달하는 의미가 있습니다.

gcc에서 main 에서 return;을 사용하려면 main함수는 반드시 void main이여야합니다.

말씀하신데로 object dump를 떠보았습니다. return 0; 은 eax에 0을 넣고 leave와 ret를 실행합니다.

하지만 return은 바로 leave와 ret를 실행해 버립니다. 즉 eax 레지스트에 결과 값을 넣고 프로그램을 종료

하느냐, 아니면 아무것도 넣지 않고 종료하느냐의 차이이며, 프로그램 종료후 eax레지스트 값을 접근하여

중요하게 사용하지 않는다면 return;과 return 0;은 아무런 실행 상의 차이가 나지 않을 것입니다.

int main()
{
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 10 sub $0x10,%esp
9: e8 00 00 00 00 call e <_main+0xe>
printf("hello world");
e: c7 04 24 00 00 00 00 movl $0x0,(%esp)
15: e8 00 00 00 00 call 1a <_main+0x1a>
return 0;
1a: b8 00 00 00 00 mov $0x0,%eax
1f: c9 leave
20: c3 ret
21: 90 nop
22: 90 nop
23: 90 nop

void main()
{
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 10 sub $0x10,%esp
9: e8 00 00 00 00 call e <_main+0xe>
printf("hello world");
e: c7 04 24 00 00 00 00 movl $0x0,(%esp)
15: e8 00 00 00 00 call 1a <_main+0x1a>
return;
1a: 90 nop
1b: c9 leave
1c: c3 ret
1d: 90 nop
1e: 90 nop
1f: 90 nop



댓글 달기

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