35.3에 참고부분에서 memset의 크기 부분을 할당받은 메모리 크기를 넘어서게 정하면 잘못된 방법이라고 나와있는데 컴파일을 해보니 메모리 크기를 넘겨도 오류가 나지 않았습니다 그 이유가 무엇인가요?
8바이트 초기화했던 부분을 16바이트 초기화로 바꿨습니다.
컴파일은 문제 없이 되지만, 실행하면 오류가 발생합니다.
할당된 크기는 8바이트인데, 이를 초과해서 16바이트를 초과했습니다. 다른 메모리 영역을 침범해서 초기화(쓰기)를 한 것이므로 프로그램이 망가지게 됩니다.
정상적으로 종료되는 프로그램이 아니므로 올바른 코딩이 아닙니다.
C 언어는 지정된 범위를 넘어 메모리를 읽거나 쓸 수 있고, 이는 프로그램 충돌 또는 보안 문제를 일으키는 주범입니다. 올바른 코딩 습관을 익히는 게 가장 중요합니다.
C 언어는 무엇이든 할 수 있는 시스템 프로그래밍 언어이고, 프로그래머의 능력에 크게 의존하는 언어입니다. 이는 강력한 장점이나 심각한 보안 버그를 초래하는 단점입니다. 이에 자바 같은 현대 언어는 "프로그래머의 능력은 믿을 수 없으니 프로그래밍 언어가 모든 것에 제한을 둬야 한다"는 개념에 바탕을 두고 있습니다. 태생 자체가 다릅니다.
쉽게 말해 C 언어는 안전 장치가 없으며 무엇이든 할 수 있는 언어이고, 자바는 안전 장치가 많으며 제한된 범위에서만 사용할 수 있는 언어입니다. 예를 들어 훈련된 프로그래머라면 포인터를 잘 다룰 수 있다고 믿는 언어가 C 언어라면, 포인터를 제대로 쓰는 프로그래머가 없으니 포인터를 없애 버린다는 결론을 내린 언어가 자바입니다.
대다수 프로그래머가 signed int와 unsigned int의 동작의 차이점과 장단점을 잘 이해하지 못하고 버그를 수없이 만드는 것을 봤으니 제임스 고슬링은 자바에서는 char를 제외하면 unsigned를 없애버리는 결정을 했습니다. 하지만, 자바8에서는 unsigned 정수 연산을 API로 추가하기는 했습니다.
C 언어 문법은 간단하지만, 해도 되는 것과 하면 안 되는 것을 일일이 학습해야 하기 때문에 설명의 범위가 넓어집니다. 자바 문법은 객체 지향을 포함해 복잡하지만, 대부분 잘 다듬어져 있어서 할 수 있는 것만 설명하면 되기 때문에 설명의 범위가 좁아집니다.
따라서 앞으로도 C 언어를 학습하면서 <C 언어 코딩 도장>에서 설명하는 범위를 넘어서 다른 실험들을 하면 대부분은 동작할 겁니다. 물론, 오류도 같이 발생할 확률이 큽니다. 그러나 이게 "해도 되는 것은 아니며" 올바른 코딩 습관이 아닌 것은 분명합니다. 책의 설명을 잘 따라 가는 게 좋습니다.