Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Cell Shader
- ColorGradingLutPass
- 벡터
- C언어
- Toon Shader
- 3d
- 가상 바이트
- VR
- Rim Light
- AppSW
- Cell Look
- Specular
- Windows Build
- 프로그래밍 기초
- ASW(Application SpaceWarp)
- Virtual Byte
- URP로 변경
- Private Bytes
- Cartoon Rendering
- OculusMotionVectorPass
- working set
- 메모리 누수
- 개인 바이트
- 게임 수학
- 작업 집합
- Three(Two) Tone Shading
- URP
Archives
- Today
- Total
WinCNT
C 언어 - 14. 동적 메모리 할당 본문
동적 메모리 할당의 개념
- 일반적으로 C언어에서는 배열의 경우 사전에 적절한 크기만큼 할당해주어야 한다
- 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 하면 동적 메모리 할당을 사용해야 한다
※동적 : 프로그램 실행 도중이라는 의미
동적 메모리 할당 함수
- C언어에서는 malloc() 함수를 이용하여 메모리 공간을 확보 가능하다
※메모리 공간 확보(memory allocation) - malloc() 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다
※여기서 주소값은 컴퓨터의 메인 메모리(RAM)의 주소값을 말함 - malloc() 함수는 <stdlib.h> 라이브러리에 정의되어 있다
malloc(할당하고자 하는 바이트 크기);
동적 메모리 할당 함수의 특징
- 동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다
(메모리 상에서 남아 있는 공간을 알아서 할당하기 때문)
#include<stdio.h> #include<stdlib.h> int main(void) { int *a = malloc(sizeof(int)); //malloc(4)와 동일 printf("%d\n", a); //malloc() 함수에 의해 할당된 메모리의 주소(임의값) /* malloc() 함수에 의해 힙 영역 할당된 메모리의 일반적인 비초기화값(-842150451) -842150451는 Visual Studio 디버거의 힙 영역의 일반적인 비초기화값 */ printf("%d\n", *a); printf("\n"); *a = malloc(sizeof(int)); //할당된 메모리에 따로 할당한 메모리의 주소를 넣는 의도치 않은 코드 printf("%d\n", a); printf("%d\n", *a); printf("\n"); a = malloc(sizeof(int)); //malloc() 함수로 힙 영역에 메모리를 다시 할당함 printf("%d\n", a); //새롭운 힙 영역의 메모리 주소로 변함 printf("%d\n", *a); //새롭게 할당된 주소의 비초기화값(-842150451) system("pause"); return 0; }
- 동적으로 할당된 함수는 힙 영역에 저장된다
코드 영역 데이터 영역 힙 영역 스택 영역 소스 코드 전역 변수
정적 변수동적 할당 변수 지역 변수
매개 변수 - 동적 할당 변수는 free() 함수 등으로 반드시 메모리를 해제해야 한다
(스택에 선언된 변수는 메모리 해제가 필요 없음)
메모리 누수(Memory Leak) 방지에는 항상 주의할 필요가 있다
#include<stdio.h> #include<stdlib.h> int main(void) { int *a = malloc(sizeof(int)); //동적 메모리 할당 printf("%d\n", a); free(a); //동적 메모리 해방 a = malloc(sizeof(int)); //동적 메모리 재할당 printf("%d\n", a); //거의 대부분 재할당 전의 메모리를 다시 할당 받음 free(a); //동적 메모리 해방 system("pause"); return 0; }
동적으로 문자열 처리하기
- memset() 함수 : 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해 사용하는 함수
※메모리 세팅(memory setting)
int i = memset(포인터, 들어갈 값, 들어갈 크기);
- 한 바이트 씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다할 수 있다
- memset() 함수는 <string.h> 라이브러리에 정의되어 있다
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char *a = malloc(100); memset(a, 'A', 100); for (int i = 0; i < 100; i++) { printf("%c ", *(a + i)); //printf("%c ", a[i]);과 동일 } system("pause"); return 0; }
동적 메모리 할당의 다양한 예제
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
//2차원 행렬의 선언
int** p = (int**)malloc(sizeof(int*) * 3); //행
for (int i = 0; i < 3; i++)
{
*(p + i) = (int*)malloc(sizeof(int) * 3); //열
}
//2차원 행렬의 값 입력
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
*(*(p + i) + j) = i * 3 + j;
}
}
//2차원 행렬의 출력
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
//메모리 할당 해제(역순)
for (int i = 0; i < 3; i++)
{
free(p[i]);
}
free(p);
system("pause");
return 0;
}
'Study > C' 카테고리의 다른 글
C 언어 - 16. 구조체 (0) | 2021.10.02 |
---|---|
C 언어 - 15. 함수 포인터 (0) | 2021.09.27 |
C 언어 - 13. 다차원 배열과 포인터 배열 (0) | 2021.09.08 |
C 언어 - 12. 컴퓨터가 변수를 처리하는 방법 (0) | 2021.09.06 |
C 언어 - 11. 문자열 (0) | 2021.09.05 |