목차
- 정적 메모리 할당
- 동적 메모리 할당 malloc(), free
- calloc(), realoc()
- 구조체 동적 생성
- 연결 리스트
1. 정적 메모리 할당
프로그램이 메모리를 할당받는 방법은 두 가지가 있습니다.
그동안 사용된 정적(static)할당과,
여기서 학습할 동적(dunamic)할당이 존재합니다.
정적 할당은 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받습니다.
예를 들어 배열 선언인 int score_s[100]; 같은게 있겠네요.
이 경우, 처음에 선언된 배열인 100을 넘어가는 입력이 들어온다면 처리하지 못합니다.
반대로 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비되게 됩니다.
2. 동적 메모리 할당 malloc(), free
그럴 때 사용되는 것이 동적 메모리 할당입니다.
동적 메모리는 실행 도중에 메모리를 할당받으며, 사용이 끝나면 시스템에 메모리를 반납합니다.
필요한 만큼만 할당을 받아 메모리를 매우 효율적으로 사용할 수 있습니다.
동적 메모리를 할당하고 반환하는 방법은 다음과 같습니다.
int* pi;
pi = (int*)malloc(4 * sizeof(int));
free(pi);
첫 줄에서 int형 데이터를 저장할 메모리 공간의 주소를 받을 포인터 변수를 선언합니다.
두 번째 줄에서 동적 메모리를 할당합니다. int형 크기만큼의 메모리를 할당하고, 해당 메모리의 시작 주소를 반환받은 뒤
포인터 pi에 저장합니다.
세 번째 줄에서 동적 메모리 사용 후 반환을 통해 메모리 누수를 방지합니다.
3. calloc(), realloc()
calloc() 함수는 메모리를 할당합니다.
사용 방법은 malloc와 비슷하지만 조금 다릅니다.
int* pi;
pi = (int*)calloc(5, sizeof(int));
free(pi);
처럼 선언하면 됩니다. 하지만 calloc는 할당 받은 메모리에 0을 채워넣는 초기화 과정을 추가로 선언합니다.
따라서 추가적인 메모리 비용이 발생할 수 있지만, malloc와 다르게 값을 추가적으로 초기화할 필요가 없습니다.
realloc()는 할당하였던 메모리 블럭의 크기를 변경합니다.
pi = realloc(pi, 10 * sizeof(int)); 처럼 크기를 변경할 수 있습니다.
4. 구조체 동적 생성
구조체 또한 동적 생성이 가능합니다.
예를 들어 구조체 struct student가 선언되면,
다음과 같이 동적 생성이 가능합니다.
struct std *p;
p = (struct std*)malloc(2 * sizeof(struct std)); 처럼 선언할 수 있습니다.
5. 연결 리스트
한번에 여러 자료를 저장하는 데는 배열(array)말고도 연결 리스트(linked list) 또한 존재합니다.
연결 리스트는 배열과 다르게 중간에 데이터를 제거하거나, 추가하는 것이 편리합니다.
'프로그래밍 > C' 카테고리의 다른 글
포인터 - 예제 모음 (0) | 2025.06.17 |
---|---|
변수의 영역과 데이터 공유 - 예제 모음 (0) | 2025.06.17 |
전처리 지시자 (0) | 2025.06.14 |
파일 입출력 함수 (0) | 2025.06.14 |
파일 개방과 입출력 (2) | 2025.06.14 |