728x90
반응형
1. 예상되는 상황
#include <stdio.h>
int main()
{
char str[32];
scanf_s("%s", str, sizeof(str));
printf("%s", str);
}
위 코드는 정상적으로 실행은 되지만, 아래 행에서 경고가 확인된다.
scanf_s("%s", str, sizeof(str));
구글링을 해봤지만 경고에 대한 설명과 해결 방법에 대한 자료를 제대로 본 것이 없다. 이런 방식으로 작성을 해본적이 없거나 왜 이런 경고 메세지가 발생했는지 궁금하지 않았나보다. 저렇게 사용하지 않고도 32와 같은 숫자로 명시해서 해결하는 등 방법은 많긴하니까. 하지만 그래도 개발자로서 이유는 알고 해결을 해야하지 않겠는가?
이 글을 읽고 계신 분들도 위의 코드와 비슷하게 작성했을 가능성이 높다. 해결 방법은 무엇이고 왜 발생하는 걸까?
2. 해결 방법
1과 2 중에서 본인의 취향 것 골라서 진행하면 된다.
- Visual Studio 상단에서 모드를 x86으로 변경한다
- 모드를 변경하기 싫다면 아래와 같이 unsigned int로 형변환을 시킨 크기로 작성해준다.
scanf_s("%s", str, (unsigned int)sizeof(str));
3. 경고 원인
sizeof()
- 피연산자의 크기를 바이트로 반환해주는 연산자
- sizeof()는 컴파일 중에 평가
- 컴파일할 때 모르는 크기는 찾아줄 수 없음
- 반환값은 size_t형(부호 없는 정수형 상수)
size_t 자료형
- 보통은 unsigned int를 사용
- 부호 없는 정수형의 상수(32비트에서는 부호 없는 32비트 정수, 64비트에서는 부호없는 64비트 정수)
- _t는 typedef 했다는 힌트
scanf_s("%s", str, sizeof(str));
위에 잠깐 요약 설명한 내용에 근거하면 Visual Studio의 모드가 64비트라면 sizeof(str)의 반환형 size_t 자료형은 unsigned long long으로 8바이트의 크기다. 버퍼 사이즈를 명시하는 unsigned int(4바이트)보다 size_t 자료형의 크기가 크기 때문에 경고가 발생한다. 위상황에서는 32가 반환되는 것이 명확하기 때문에 무시해도 상관은 없다. 하지만 경고가 계속 신경 쓰인다면 32비트 환경으로 변경하여 sizeof의 반환형을 unsigned int로 만들어주던지 또는 (unsigned int)로 형변환 처리를 하면 깔끔하게 해결된다.
728x90
반응형
댓글