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
댓글 입력