본문 바로가기

CS/CS Book

[컴퓨터 시스템 딥다이브] ch02 C프로그래밍 심화 part01(2.1~2.6)

💡이 글은 컴퓨터 시스템 딥다이브(수잰 J. 매슈스, 한빛미디어 2024)를 읽고 적은 글입니다.

 

이번 장에서는 배열, 포인터, 동적 메모리 할당, 문자열 및 문자열 라이브러리, C구조체, C의 입출력 등에 대해서 다룬다.

이미지를 통해 메모리 구조, 포인터와 동적할당을 잘 보여주어서 굉장히 접근하기 좋았다.

출처: tcp school C 메모리 구조

 

포인터를 통해 데이터에 간접 접근을 할 수 있다. 간접 접근 함으로써 큰 데이터를 직접 옮기지 않고 가리키는 포인터만으로 가볍게 처리할 수 있다.

포인터표지판에 비유할 수 있을 거 같다.

 

출처: 아웃도우 뉴스 / 도심 속 휴기
출처: 재오한인 / 정제된 구조 장엄한 공간, 종묘

 

종묘는 한 곳에 있지만 종묘를 가리키는 표지판(포인터)은(는) 여러 개가 있을 수 있고 다른 곳에서 종묘(데이터)에 접근하고 싶다면 표지판(포인터)을 통해 접근할 수 있다.

굳이 종묘라는 곳을 똑같이 새롭게 만들 필요 없이 표지판을 통해 접근만 하면 되기에 무겁지 않게 데이터에 접근하고 쓸 수 있다.

 

출처: TCP school  메모리의 구조

 

가장 기억에 남는 것은 힙은 익명 메모리라서 힙의 주소가 변수명에 바인딩되지 않는다는 점이었다.

 

힙 영역에 할당하고 포인터 타입으로 선언한 변수를 통해 데이터를 접근하고 활용했었지만 포인터 변수가 대해 깊이 생각해보지 않았었다. 동적할당은 힙에 하는 것이니까 힙에 담는다 생각했었는데 가리키는 것은 지역변수, 전역변수를 쓰기에 다른 영역(스택, 데이터)에서 쓰인다는 걸 깨달을 수 있었다.

 

익명 메모리니까 가리키던 표지판이 새로운 다른 힙 메모리를 가리킬 때 기존 공간은 leak 날 수 있는 것도 이해되었다. 이름 없는 공간을 가리키던 곳(지역변수 혹은 전역변수 포인터)이 사라졌으니 어떤 공간이 동적할당 되어 있었더라도 찾을 수 없는 게 당연하다는 것이 힙은 익명 메모리라는 설명 덕에 잘 이해되었다.

 

 

배열의 2차원 할당도 첫 번째 배열의 한 칸 한 칸마다 또 다른 배열이 할당되어 있음을 친절한 그림으로 설명해 주어 쏙쏙 들어온다.

책의 전개 과정도 좋았다. 포인터, 동적할당, 1,2차원 배열 할당, 문자열과 문자열 라이브러리 순서로 전개되어서 자연스럽게 이해하기 좋다.

 

문자열 함수의 경우 문자열 마지막에 '\0'이 문자열의 끝을 알 수 있게 꼭 들어가야 했기에 생길 수 있는 문제들과 그런 불안정성을 해결하기 위해 나온 함수들 순서로 소개해주어 새롭게 나온 함수의 쓸모에 대해 공감하기 좋았다. strtok()의 경우 문자열을 잘라주는 구분자가 문자열이라는 게 눈에 띄었고 꽤나 유용하다 생각 들었다.