컴퓨터 메모리 종류
-
개념
- CPU는 연산할 코드와 대상 정보 모두를 메모리로부터 가져옴
- 메모리는 변수를 통해 사용
- 모든 메모리는 고유한 주소를 가짐
- 64bit 시스템에서 메모리 주소 길이는 64bit임
-
메모리의 종류
- Stack(자동 변수, 보통 1MB)
- Heap(동적 할당 메모리) → 런타임
- 실행 코드
- text(code) section → executable code machine language
- data section → read only(문자열 상수), read/write(정적 메모리)
-
가상 메모리 시스템
- 프로세스 → 집이라고 생각
- 스레드 → 집에 사는 사람

포인터 변수 기본 문법
- 포인터 변수
- 메모리의 주소를 저장하기 위한 전용 변수
- 주소 상수, 포인터 변수는 모두 8bytes(64bit 시스템에서)
- 1bytes char형 변수의 메모리 주소는 64bit
- 직접 지정과 간접 지정
- 특정 메모리 공간을 int로 지정할 때 상수로 지정하면 직접 지정
- 포인터 변수로 지정하면 간접 지정
포인터와 1차원 배열
- 개념
- 포인터를 사용하는 많은 케이스 중에서 1차원 배열 관련 케이스가 많았다
- 배열을 이루는 요소 형식에 대한 포인터 변수를 선언하는 것이 일반적
- char []는 char*로 관리
- int []는 int*로 관리
- 간접 지정 연산(*)의 결과는 형식이 있는 변수로 생각할 수 있음
- 포인터 변수나 배열 이름에 대해 덧셈, 뺄셈 연산을 할 수 있음
- 이 덧셈, 뺄셈은 산술 연산이 아니라 상대 위치를 계산하기 위한 연산이며 배열 요소의 개수를 의미
- 포인터 변수에 대해서는 단항 증/감 연산도 가능
#include <stdio.h>
int main() {
// 배열 예제 1
int aList[5] = { 0, 1 };
int * pnData = aList;
printf("aList[0] : %d\\n", aList[0]);
* pnData = 20;
printf("aList[0] : %d\\n", aList[0]);
printf("pnData[0] : %d\\n", pnData[0]);
// 배열 예제 2
char arr[16] = { "hello" };
char* pnData = arr;
while(*pnData != '\\0') {
pnData++;
printf("&pnData: %p, &arr: %p", pnData, arr);
printf("Length: %d\\n",pnData - arr);
}
return 0;
}
메모리 동적 할당 및 해제
- 개념
- 입력 받을 데이터의 크기와 범위가 정해지지 않은 경우
- Heap 영역을 사용하는 방식
- 프로그램 실행 중 필요한 메모리를 OS에 요청해 사용하며 반환의 책임이 있음
- 할당 받은 메모리는 쓰레기 값이 들어있음
- malloc()/free()
- 초과해서 쓰기할 경우 캐너리 비트에 쓰기가 들어가고
- Canary bit → 오버 플로우를 보호하기 위한 값
- free() 함수는 그제서야 문제를 인지
메모리 초기화, 복사, 비교