<동적 메모리 할당 개념>
- 일반적으로 C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해주어야 한다.
- 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적 메모리 할당을 사용한다.
- 동적이라는 말의 의미는 '프로그램 실행 도중에' 라는 의미이다.
- 동적메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다.
- 동적으로 할당된 변수는 <힙 영역>에 저장된다.
<동적 메모리 할당 함수>
1) C언어에서는 malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다.
2) malloc() 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다.
3) malloc() 함수는 <stdlib.h>라이브러리에 정의되어 있다.
ex) malloc(할당할 바이트 크기);
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
printf("%d\n", a);
a = malloc(sizeof(int));
printf("%d\n", a);
system("pause");
return 0;
}
//출력값 두개 다 같게 나왔음, 하지만 매번 실행 할 때마다 다른 주소값이 할당 될 수 있으므로 변칙적이다.
- 전통적인 C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지 않아도 된다.
- 반면에 동적으로 할당된 변수는 반드시 free()함수로 메모리 해제를 해주어야한다.
- 메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생한다.
- 메모리 누수(Memory Leak) 방지는 코어개발가의 핵심 역량이다.
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
printf("%d\n", a);
free(a); //메모리 할당 해재해줌
a = malloc(sizeof(int));
printf("%d\n", a);
free(a);//메모리 할당 해재해줌
system("pause");
return 0;
}
// 메모리 할당을 해제해줬기 때문에 웬만하면 두 print문에서 동일한 주소값이 출력될 것이다.
// 왜냐하면 첫번째 a는 할당 해제 뒤 메모리가 비어있고 바로 다음 줄에서 메모리 할당을 해줄 확률이 높기 때문이다.
<동적 문자열 처리하기>
- 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해서는 memset()을 사용한다.
- memset(포인터, 값, 크기);
- 한 바이트씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다.
- 따라서 memset() 함수는 <string.h> 라이브러리에 선언되어 있다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *a = malloc(100); //100바이트 할당
memset(a, 'A', 100);
for(int i=0; i<100; i+){
printf("%c",a[i]);
}
system("pause");
return 0;
}
// A가 100개 출력된다.
- 동적 메모리 할당의 예제
#include <stdio.h>
#include <stdlib.h>
int main(void){
int **p = (int**)malloc(sizeof(int*) * 3);
for (int i=0; i<3; i++){
*(p+i) = (int*)malloc(suzeof(int)*3);
}
for (int i=0; i<3; i++){
for (int j=0; j<3; j++){
*(*(p+i)+j) = i*3+j;
}
}
for (int i=0; i<3; i++){
for (int j=0; j<3; j++){
printf("%d",*(*(p+i)+j));
}
printf("\n")
}
system("pause");
return 0;
}
// 0 1 2
// 3 4 5
// 6 7 8
// 형태로 출력된다.
'컴퓨터 기본 개념' 카테고리의 다른 글
17장. 구조체 (0) | 2020.07.30 |
---|---|
14장. 다차원 배열과 포인터 배열 (0) | 2020.07.29 |
35강. 깊이 우선 탐색 (0) | 2020.07.28 |
자료구조와 알고리즘 - 그래프 개념과 구현 (0) | 2020.07.27 |
33강. 탐색-순차 탐색과 이진 탐색 (0) | 2020.07.27 |