인프런 커뮤니티 질문&답변

donghun Kang님의 프로필 이미지
donghun Kang

작성한 질문수

홍정모의 따라하며 배우는 C언어

4.9 printf() 함수가 인자들을 해석하는 과정

4.9 질문 있습니다.

작성

·

273

1

printf("%hhd %f", i, f); int i = 300; f=21.753241f라 했을 때 인자가 stack에 복사될 때 %f 부분은 왜 정상적으로 출력이 될까요? stack에 복사될 때 애초에 1바이트로 짤려서 복사가 되는 건가요?

답변 1

1

안녕하세요, 답변 도우미 Soobak 입니다.

앞의 %hhd 형식지정자는 signed char 자료형의 인자를 기대합니다.
하지만, 실제로 전달되는 인자는 int i = 300int 자료형입니다.
이 때, printf() 함수는 int 값을 signed char 자료형으로 해석하려고 하며, 이는 UB, 정의되지 않은 동작 입니다.
일반적으로 int 의 하위 1바이트만을 사용하여 signed char 으로 해석하려고 시도하지만, 이는 컴파일러나 환경에 따라 달라질 수도 있습니다.
만약, 이 부분에 대해서 "짤려서 복사되는 것" 으로 표현하신 것이라면 일부 맞게 이해하신 내용입니다.

추가적으로,

  • 정의되지 않은 동작에 대한 해석은 컴파일러와 환경에 따라서 달라질 수 있다는 점

  • 정의되지 않은 동작을 피하기 위해 자료형에 맞는 올바른 형식 지정자를 사용해야 한다는 점

  • 스택 자료구조와 printf() 함수가 인자를 읽어들이는 과정

위 내용들에 초점을 맞추고 주의하시면서 이해하시는 것이 보다 더 적절할 것 같습니다.

donghun Kang님의 프로필 이미지
donghun Kang
질문자

"짤려서 복사되는 것"이라 말한 이유는 4.9 강의 내용대로라면 printf에 인자가 stack에 복사될 때 4바이트로 복사된다면 %hhd를 해석하는 과정에서 밀려서 %f 값까지 잘못 해석할 거라고 생각했는데 %f가 잘 나오는 것으로 보아 애초에 스택에 1바이트만 짤려서 복사된 건가라고 유추해 봤기 때문입니다. 초점에 어긋나는 것은 압니다만 궁금해서 여쭤봅니다.

안녕하세요, 답변 도우미 Soobak 입니다.

제가 답변을 전달하는 데에 있어서 잘 전달 못드린 것 같아요! 죄송합니다...

단순화해서 정리하여 말씀을 전달드린다는 것이, 답변을 하는 말투에 오해를 불러일으키지 않았나 생각이 듭니다... 🥲

개인적으로, 전혀 초점에 어긋나지 않는 좋은 질문이셨다고 생각했어요!!
질문자님께서 어느 것을 유추하시며 질문하시는지 이해를 하였었고,
저 또한 앞의 %hhd형식지정자와 int 로인해 뒤의 %f 해석이 잘못 될 줄 알았는데요...!
질문자님 덕분에 저도 직접 실험하고, 자료를 찾으며 공부해보면서 답변을 드린 것이라, 재미있다고 생각한 답변이었습니다.

제가 오해를 하게 말씀드려서 다시 한번 진심으로 죄송합니다...!
궁금한 점이 있으실 때마다 언제든지 편하게 질문해주세요!
저도 앞으로 더욱 신경써서 답변드리도록 하겠습니다...!!!

donghun Kang님의 프로필 이미지
donghun Kang

작성한 질문수

질문하기