11장 메모리와 포인터 – 11.1 컴퓨터와 메모리

C언어 – Inflearn, 독하게 시작하는 C 프로그래밍

 

11.1 컴퓨터와 메모리

변수의 본질은 메모리이며 모든 메모리는 자신의 위치를 식별하기 위한 근거로 고유번호(일련번호)를 갖는데, 이 번호를 메모리의 주소라고 한다. 주소로 메모리를 식별하는 것은 low-level 특성이다. high-level에서는 주소보다는 이름(식별자)으로 식별한다. 따라서 변수의 선언 및 정의는 메모리 확보를 의미하며, 선언 시 부여한 이름으로 확보한 메모리를 식별한다.

변수를 이루는 세가지 요소는 다음과 같다. 1. 이름이 부여된 메모리 2. 그 안에 담긴 정보 3. 메모리의 주소

 

출력

 

메모리의 종류

Stack : 자동변수이고 지역변수인 변수가 사용하는 메모리 영역이며, 임시 메모리의 성격을 가진다. 크기가 작고(기본 설정을 기준으로 최대 1MB 수준) 관리(할당 및 반환)가 자동으로 이루어지는 장점이 있다.

Heap : 동적 할당할 수 있는 자유 메모리 영역이며, 개발자 자신 스스로 직접 관리(수동)해야 한다. 32비트 응용프로그램의 경우, 대략 1.xGB 정도를 사용할 수 있다. 따라서 대량의 메모리가 필요하거나 필요한 메모리의 크기를 미리 알 수 없을 때 사용한다.

PE image(실행 파일)의 Text section : C언어의 소스코드가 번역된 기계어가 저장된 메모리 영역이며, 기본적으로는 읽기전용 메모리이다. 만일 어떤 식으로든 이 영역의 메모리를 변조한다면, 해킹이다.

PE image(실행파일)의 Data section(Read Only) : 상수 형태로 기술하는 문자열(예: “Hello”)이 저장된 메모리 영역이며, Text 영역처럼 읽기는 가능하나 쓰기는 허용되지 않는다.

PE image(실행파일)의 Data section(Read/Write) : 정적변수나 전역변수들이 사용하는 메모리 영역이며, 별도로 초기화하지 않아도 0으로 초기화된다. 관리는 자동이라서 힙 영역 메모리처럼 할당 및 해제를 신경 쓸 필요가 없다.

 

포인터 변수의 선언 및 정의

포인터 변수는 메모리의 주소를 저장하기 위한 전용 변수이다. 단항 연산자인 주소 연산자를 사용하여 메모리의 주소를 알아낼 수 있다. ‘&nData’라는 연산은 “이름이 nData인 메모리의 실제 주소는?”이라는 의미이다.

주소 연산과 정반대되는 개념의 연산자는 ‘간접지정 연산자(*)’이다. 우리가 지금까지 변수를 선언 및 정의하여 메모리를 사용한 것이 ‘직접방식’이다. 간접지정은 변경될 수 있는 임의의 기준주소로 상대적인 위치(주소)를 식별하는 방식이다. 어떤 기준을 근거로 상대인 메모리의 위치를 설명하는 방법이 ‘간접지정’이다.

출력

 

포인터와 배열

배열의 이름은 0번 요소의 주소이며, 전체 배열을 대표하는 식별자이다. 그리고 포인터 변수는 주소를 저장하기 위한 변수이다. 따라서 배열의 이름이 주소이므로, 포인터 변수에 저장할 수 있다.

출력

 

*(pnData + 0)을 다른 코드로 표시하면 정확히 pnData[0]이다. 배열과 포인터가 문법상 호환되는 이유는 개념적으로나 기술적으로나 사실상 같기 때문이다.

 

출력

 

주소의 차이를 이용하여 문자열의 길이를 측정해보기

출력

 

댓글 남기기

Close Menu