C언어 return 값 질문

조회수 1385회

include

void main() {

printf(" aaa ");

return 'a';

}

이와 같이 코드를 작성했습니다. main함수의 반환형태를 void 를 지정해줬기 때문에, main은 OS에 반환값을 전달하지 않는 것으로 알고있습니다.

저는 이러한 이론을 바탕으로 명령 프롬프트 창으로 c언어 디버그파일을 열어서

echo %errorlevel% 명령으로

main함수가 os에 반환값을 전달해 주지 않았는 지 확인을 했습니다.

이미지

위 사진은 제가 명령 프롬프트 창을 통해 반환값을 확인한 결과입니다.

제가 아는 이론대로라면 반환값이 전달되지 않아야 하는데,

사진대로 a의 아스키코드 값인 97이 반환이 된걸 확인할 수 있습니다.

열심히 구글링을 하고 외국자료를 살펴보고 있지만, 어려운점이 많아서 질문 올려봅니다~

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 왜 된것인가를 묻는 것이라면...

    해당 바이너리를 디버깅을 해봐야 합니다.

    분명 main 함수 리턴시 레지스터 eax 에 리턴값이 저장되어 있을 겁니다.

    c언어는 고급언어로 cpu가 볼때는 알 수 없는 텍스일뿐입니다. 이것이 컴파일이 되어 바이너리 코드로 변환되었을때 의미가 있는 것이죠

    즉 질문자의 궁금증은 왜 컴파일 에러도 안내고 컴파일 되면서 결과는 잘못된 결과를 도출하느냐가 질문일 겁니다. 그러나 이 부분은 컴파일러가 그렇게 되어 있기 때문이라고 할 수 밖에는 없습니다.

    사용한 컴파일러와 버전도 중요합니다.

    gcc version 8.2.1 20181215 (Red Hat 8.2.1-6) (GCC) 에서는 아래와 같이 경고를 줍니다.

    [allinux@lghah ~]$ gcc -o test test.c
    test.c: In function ‘main’:
    test.c:5:12: warning: ‘return’ with a value, in function returning void
         return 'a';
                ^~~
    test.c:3:6: note: declared here
     void main(){
          ^~~~
    
    
    • 그렇다면 답변자님은 제코드를 바이너리 코드로 변환 시켜서 결과값을 주신건데, 그 결과 컴파일러에서 " 메인함수가 void인데 반환값이 a 이다 " 라는 오류 메세지를 받을 수 있었고, 제가 a값을 리턴받은 이유는 컴파일러가 그렇게 구성이 되어있기 때문에 , main함수 반환형이 void일지라도 return값이 os에 전달되어서, cmd 창으로 반환값을 받아볼수 있는것이다. 라는 말씀이신건가요~? 제가 잘못짚은 내용이 있다면 수정해서 설명해주시면 감사하겠습니다~~ 알 수 없는 사용자 2018.12.28 19:44
    • c 의 철학자체가 "프로그래머를 전적으로 신뢰한다" 입니다. 그리고 어셈블리어를 공부하시면 이해가 한번에 될겁니다. os 에 전달이 아니라 함수의 리턴값은 레지스터 eax에 저장됩니다. 함수 호출뒤 eax 값이 리턴값이 되는 겁니다. 즉 main 함수 호출뒤 eax값이 'a' 였을겁니다. 그러나...이 역시도 컴파일러마다 결과가 상이할 수 있습니다. 결국 바이너리를 직접 디버거로 보시는 편이 가장 확실합니다. cpu 입장에서 c언어 코드는 그냥 문자열입니다. 정영훈 2018.12.28 23:12

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)