PS/자주 하는 답변

atoi에 char 변수의 주소를 넣으면 안 됩니다.

djm03178 2023. 5. 9. 07:07

PS를 하다 보면 문자열로 저장된 수를 정수형으로 바꾸고 싶은 경우가 종종 있습니다. 이를 위해서 편하게 사용할 수 있는 C 라이브러리 함수가 하나 있는데 바로 atoi입니다. 단, 어떤 라이브러리든 마찬가지이지만 사용할 때에는 그 사용법을 정확히 알고 사용해야 하는데 atoi에도 초보자들이 매우 자주 하는 실수가 있습니다.

 

atoi에는 절대로, 절대로 하나의 char 변수의 주소값을 넘겨서는 안 됩니다.

 

atoi가 const char *를 인자로 받기 때문에 얼핏 보면 char 변수 앞에 &를 붙여서 그 주소를 넘겨주면 자료형 문제가 해결되어 사용할 수 있을 것처럼 보입니다. 하지만 그건 올바른 해결 방법이 아닙니다. atoi는 문자가 아니라 문자열을 인자로 받는 함수이기 때문입니다.

 

문자열의 끝에는 항상 널 문자가 들어갑니다. 글에서 다루었듯이 문자열은 연속된 char들의 끝에 널 문자가 추가로 있어야만 문자열이라고 부를 수 있습니다. 하지만 char형 변수 하나는 그저 char형 하나일 뿐, 연속된 공간 끝에 널 문자를 가지는 구조가 전혀 아닙니다. char 변수 앞에 &를 하나 붙인다고 알아서 뒤에 널 문자가 붙어준다거나 하는 건 없습니다.

 

그런데 직접 해봤을 땐 문제 없이 잘 되던가요? 그럴 수도 있지만, 그렇다고 해서 그 방법이 올바른 사용법인 것은 아니며 다른 환경에서는 전혀 다르게 동작할 수도 있는 undefined behavior입니다. Undefined Behavior가 있으면 무슨 일이 일어나도 이상하지 않습니다. 글을 참고하세요.

 

char 변수 하나에 저장된 '숫자'를 해당하는 값의 정수형으로 바꾸고 싶다면 단순히 '0'을 빼주면 됩니다.

char c = '5';
// int x = atoi(&c); // WRONG!!
int x = c - '0'; // OK