관심쟁이 영호
scanf ? scanf_s ? 어떤 차이가 있을까? 본문
안녕하세요 최고왕입니다!
오늘은 scanf / scanf_s의 차이에 대해서 알아볼까 해요!
결론부터 말씀드리자면!
Scanf?
scanf는 버퍼 오버플로우라는 문제가 발생할 위험이 상당히 커요!
그래서 scanf_s를 새롭게 만들게 된 유래가 있죠!
버퍼 오버플로우?
버퍼 오버플로 또는 버퍼 오버런을 사전적 의미로 먼저 봅시다!
위키백과에서 버퍼 오버플로는
"프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미한다."
라고 설명하네요!
버퍼?
그럼 버퍼가 무엇인지 알아봅시다!
위키백과에서 사전적 의미로 보면!
"버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역이다."
이 말은 즉슨
주방에서 요리를 한다고 했을 때!
요리를 완성하기 위해서는 재료 준비, 재료 손질 등등 여러 가지 일을 해야 하는데요!
이 일을 하기 위해선 순차적으로 해야 하죠..
우리는 여러 가지 일을 한 번에 할 수 없으니까!
그리고 모든 일은 순서가 있는 법이니까!
컴퓨터도 마찬가지라고 생각하시면 돼요!
컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용되는 게 버퍼예요!
흔하게 네트워크 상에서 자료를 주고받을 때나 스피커 소리를 재생할 때!
하드웨어의 입출력을 결합할 때 자주 사용됩니다.
여하튼! 복잡하고!
한마디로 컴퓨터가 데이터를 다루는데 아주 효율적으로 다루기 위해서 버퍼를 사용한다는 소리예요!
오버플로우가 되는 게 뭐가 어때서?
음 우리가 배열을 만든다고 생각합시다!
배열의 크기는 10이고 안에 정보 값들이 저장되어있어요!
근데 우리가 프로세스를 구동하면서
이 배열은 A라는 버퍼에 저장이 되는 순간이 있어요!
근데 만약에 A라는 버퍼에 10이라는 크기를 넘어서는 데이터를 저장하게 되는 순간이 올 테죠.
그러면 컴퓨터는 10이라는 크기를 넘어서서 넘친 데이터를 다른 곳에다가 저장하게 돼요!
그러면 데이터는 오염이 되는 거예요!
이를 악용하여 악의적 프로그래머들이 잘못된 용도로 그 정보를 사용할 가능성도 아주 높아요!
그래서 데이터 오염, 악의적 프로그래머 등등 여러 가지의 안 좋은 이유 때문에
scanf_s를 권장하게 되는 겁니다!
scanf_s??
scanf_s는 scanf와 어떤 점에서 다르냐!!
scanf_s는 scanf와는 다르게 사이즈를 넘어서게 된다면 아예 저장을 하지 않아요!
그래서 버퍼 오버플로우 현상이 일어나지 않죠!
scanf를 계속 사용하고 싶다면!
첫 부분에
#define _CRT_SECURE_NO_WARNINGS라는 코드를 쳐줍니다!
그러면 컴퓨터는 scanf를 scanf_s로 바꾸게 됩니다.
여기까지 최고왕이었습니다.
읽어주셔서 진심으로 감사드립니다.