모두의 코드
모두의 코드

총 42 개의 강의로 준비된 씹어먹는 C 언어 강좌를 통해 C 언어의 처음부터 끝까지 배우실 수 있습니다! 특히 악명 높은 C 언어의 포인터나, 어려운 개념들을 충실히 짚고 넘어갑니다.

이 강좌는 2010년에 완결되었지만, 지속적으로 개선 및 보완하고 있습니다.

C 언어 문법을 아시는 분들이라면, 씹어먹는 C++ 강좌를 통해 C++ 기초 부터 최근의 C++ 17 까지 모든 내용을 배우실 수 있습니다. C 언어와 C++ 의 기본적인 문법이 비슷하기 때문에, C 언어를 어느 정도 아는 독자를 가정하여 쓰여져 있습니다.

이 강좌는 2020년에 완결되었고 총 50 개의 강좌가 준비되어 있습니다.

사이트 내에서 검색 하기
C 언어 레퍼런스
표준 입출력 라이브러리 stdio.h
문자열 관련 라이브러리 string.h
시간 관련 라이브러리 time.h
C ++ 레퍼런스
문자열 라이브러리 string
알고리즘 라이브러리 algorithm
최근 댓글
Jaebum Lee 07.08
Jaebum Lee 07.08
Jaebum Lee 07.08
**아주 훌륭하신** 질문입니다. 사실 이 질문에 대해서 대답을 정확하게 하기 위해서는 꽤나 깊게 들어가야 하는데 나중에 글을 하나 작성해볼까 합니다. 간단하게 이야기 하자면, 우리가 보는 포인터를 통해서 보는 *주소값* 은 실제 메모리 상의 주소값과 일치하지 않습니다. 메모리 상에 실제 주소값을 물리 주소값(physical memory address) 라고 하는데, 운영체제에서 물리 주소값을 그대로 쓰는 것이 아니라, 자기들 나름 대로 관리하는 가상 주소값 (virtual memory address) 에 대응 시켜서 사용합니다. 예를 들어서 포인터 주소를 출력했을 때 0x1234 가 나왔다고 해서, 실제 메모리를 뜯어보았을 때 0x1234 에 우리의 데이터가 있다는 법이 아니라는 것입니다. 이러한 매핑을 **페이징(paging)** 이라고 하고, 페이징을 사용하는 이유는 여러가지가 있는데, (1) 물리 메모리를 효율적으로 관리하기 위해서 (2) 각 프로그램들이 마치 메모리 전체를 사용하는 듯한 효과를 내기 위해서 로 꼽을 수 있습니다. 하욱현씨께서 질문하신 내용은 (1) 에 좀 더 연관되어 있습니다. 예를 들어서 프로그램 A 와 B 가 메모리에서 여기 저기 연속된 부분을 사용한다고 해봅시다. 만일 페이징이 사용되지 않는다면, 프로그램에 연속된 메모리를 제공하기 위해선 실제 메모리에서 연속되어 있는 부분을 찾아야 합니다. 이는 상당히 어렵지요. 하지만 페이징 덕분에 연속되어 있지 않는 메모리 부분 부분을 잘 매핑해서 마치 프로그램에서는 연속되어 있는 것 처럼 느끼게 해줄 수 있습니다. 예를 들어서 메모리에서 0x1000 ~ 0x1100 과 0x2000 ~ 0x2100 이 사용 가능하다고 해봅시다. 그런데, 만일 프로그램이 0x200 바이트의 연속된 메모리를 사용하고 싶어한다면 페이징 없이는 불가능하겠지만, 페이징을 통해서 물리 주소 0x1000 ~ 0x1100 은 가상 주소 0x0 ~ 0x100 에 대응시키고 물리 주소 0x2000 ~ 0x2100 을 가상 주소 0x100 ~ 0x200 에 대응 시킨다면, 프로그램의 입장에서는 0x0 부터 0x200 의 연속된 메모리를 사용하는 것 처럼 쓸 수 있습니다. 아무튼 이러한 방법을 통해서 우리의 프로그램에서 10000 바이트 짜리 배열을 선언해도 문제 없이 돌아가게 됩니다. 전부 운영체제 단에서 일어나는 마술 이라고 볼 수 있죠.
Jaebum Lee 07.08
Jaebum Lee 07.08
Jaebum Lee 07.08