jeonggu223   3년 전

저는 숫자를 문자열로 받아 마지막 숫자가 홀수인지, 아닌지를 판단하여 바로 답을 출력하게끔 구현을 했습니다.

제 환경에서는 잘 돌아가는 코드인데 제출할 경우 NeverBeNull 런타임에러가 발생합니다.

그래서 long long형태로 구현을 하여 해결하였지만 왜 런타임에러가 뜨는 것인지에 대해서 궁금하여 질문합니다. 알려주시면 감사하겠습니다!

bupjae   3년 전

scanf 로 문자열을 받기 위해서는 실제 문자열이 들어갈 메모리를 확보해야 합니다.

하지만 char *n; 은 "문자열을 가리킬 수 있는 변수"일 뿐, 실제로 문자열이 들어갈 메모리를 확보하는 것은 아닙니다.

심지어, char *n 은 초기화가 되지 않은 지역변수로, 누구도 알지 못하는 장소를 가리키고 있습니다.

   

따라서, 6번째 줄의 scanf 는 "문자열을 입력받아, 누구도 알지 못하는 장소에 저장하라" 라는 의미가 되며

이러한 프로그램의 수행 결과는 정의되어 있지 않습니다. (undefined behavior)

대부분의 경우 런타임 에러를 내뱉으면서 프로그램이 강제종료 되겠지만, 실행 환경이 달라지면 한참 후에 잘못된 결과를 내뱉을 수도 있고, 심지어 아주 우연히 프로그램이 정상 동작하는 것 처럼 보일 수도 있습니다.

jeonggu223   3년 전

감사합니다!! 도움이 많이 되었습니다!!

댓글을 작성하려면 로그인해야 합니다.