[완료][추가질문]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데...
글쓴이: hangsookang / 작성시간: 토, 2012/01/28 - 1:12오전
열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데 왜 오류가 나는 지 모르겠습니다 ㅠㅠ
라는 제목의 질문글에서 올렸던 코드입니다.
바로가기: http://kldp.org/node/129595
#include <stdio.h> int main(void) { char a, b; char result; printf("-50 이상 +50 이하의 수 둘 입력 : "); scanf("%d %d", &a, &b); result=a+b; printf("두 수의 덧셈 결과 : %d \n", result); return 0; }
이 코드를 실행해서 a 와 b 에 숫자를 넣어주면
b 만 나오는 오류가 있었는데
원인을 찾다보니 버퍼 오버플로라는 것을 알게되어
메모리를 도식화해서
이 코드의 문제를 정리해봤습니다.
제가 이해한 것이 맞는 지 봐주시면 감사하겠습니다 :)
앞선 질문에 답해주신 분들 모두 감사합니다~~~
생각지도 못하게 이것 저것 많이 알게되니 기분 좋네요 ^^;
====
모두들 새해 복 많이 받으세요!
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 85.37 KB |
Forums:
방향은 옳게 잡으셨습니다. 변수간에 영역을
방향은 옳게 잡으셨습니다. 변수간에 영역을 침범한거죠.
1. 다만 scanf() 를 수행한 후라고 해서 b에게 주어진 공간이 갑자기 4칸으로 늘어나진 않죠.
a+b 할때의 b는 여전히 1byte만 읽습니다.
그럼 왜 저런 결과가 나오느냐?
2. 추측컨데 아마 4byte 10은 00001010 / 00000000 / 00000000 / 00000000 으로 저장되고,
4byte 20은 00010100 / 00000000 / 00000000 / 00000000 으로 저장되었을 겁니다.
만약 결과로 20이 나왔다면, 메모리에 a / b 순서가 아닌 b / a 순서로 지정되었을 거라 "추측" 해봅니다.
이 문제의 결과에 대한 정확한 원인 분석을 위해서는
사용하신 컴퓨터의 리틀엔디안/빅엔디안 여부, 워드 크기, 컴파일러의 종류와 버전 등 많은 정보를 알아야 합니다.
거꾸로 말해서, 같은 C 코드라고 해도 엔디안이나 워드 크기, 혹은 컴파일러 버전만 달라져도 다른 결과가 나올수 있습니다.
그러므로 사용하신 컴파일러가 저 코드를 어셈블리로 어떻게 번역했는지를 열어봐야 정확한 확인을 할수 있습니다...
본의아니게 너무 혼란을 드리는것 같지만, 설명을 위해서는 어쩔수 없네요.
사족 하나 더:
결국 이런 문제 때문에 printf() 나 scanf() 함수는 "char는 %hhd, short은 %hd, int는 %d, ..." 하는 식으로 프로그래머가 format string을 일일이 잘 맞춰줘야 하죠.
리틀엔디안/빅엔디안까지 확인해보고나니 드디어 이
리틀엔디안/빅엔디안까지 확인해보고나니
드디어 이 문제의 끝이 보이는 것 같습니다!!
감사합니다 헤헤
사족도 감사합니다. 공부할 게 점점 더 생기네요 ㅎㅎ 좋습니다 ^^
"안됨 말고,"
근데 KLDP에 댓글 수정버튼 아예 사라졌나요?
근데 KLDP에 댓글 수정버튼 아예 사라졌나요? 예전엔 다른 댓글 달리기 전에는 수정이 됐었는데... 평소에 글쓰기 눌러놓고 검토하는 버릇이 있었는데 영 적응 안되네요.
지난번 질문을 읽어보고 추가하자면, %d는 아시다시피 4byte 정수를 입력받을때 사용하구요.
%c는 char에 문자를 입력받을때 사용하는 것이고... 1byte 정수를 위해서는 위에 적었듯 %hhd를 사용합니다.
물론 지난번 글에 여러 분들께서 도와주셨지만 아무도 언급 못했던 것처럼
%hhd를 쓰는 경우가 사실상 없다시피해서 굳이 기억해둘 필요도 없습니다.
댓글수정버튼 있으면 좋겠네요 ㅎ 공부수고를
댓글수정버튼 있으면 좋겠네요 ㅎ
공부수고를 덜어주시네요 ㅎㅎㅎ
"안됨 말고,"
댓글 달기