Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
more
Archives
Today
Total
관리 메뉴

나의 IT일지

동적 메모리 할당 2 본문

프로그래밍 언어/C언어

동적 메모리 할당 2

세레프 2023. 2. 28. 05:32

 동적 할당 메모리란 프로그램의 실행 도중, 할당 받은 메모리로, 정적 메모리를 사용하면 메모리의 낭비가 생기는 것을 방지하기 위해 사용된다.

 

동적 메모리 할당 1

일반적으로 변수나 배열은 소스코드에서 코드나 배열을 생성해두면, 프로그램을 실행하는 순간 사용할 메모리의 크기를 고려하여 메모리에 주소가 할당되는 경우가 일반적이다. 이를 정적 메

my-it-diary.tistory.com

  •  동적메모리는 "stdlib.h"안에 있는 "malloc()"함수를 사용하여 메모리를 실행 도중에 생성 하는 것
  • "malloc()"함수는 주소값이 결과값으로 나오기 때문에, 포인터에 저장해서 사용해야 한다. 즉 "포인터 = (포인터형*)malloc(sizeof(자료형));"를 통해 포인터에 주소를 저장
  • malloc함수의 결과는 void*형이기 때문에 포인터와 같은 자료형으로 맞추기 위해서 (포인터형*)을 사용해서 결과값의 형태를 변경

 우리는 동적메모리를 통해 변수 뿐만 아니라 배열을 만들 수 있다. 배열을 만드는 방법은 "malloc()"함수의 매개변수가 "sizeof(자료형)* 변수개수"를 하면 배열이 완성이 된다. 이것은 1차원 배열뿐만 아니라, 다차원배열에서도 사용이 된다.

 

동적 할당 메모리  -  2차원 배열

 2차원 배열을 만들 때에는 이중포인터를 사용해야 한다. 이중포인터란 포인터의 주소를 저장하는 포인터이다. 

 위의 그림은 이차원 배열을 주소를 통해 배열에 접근하는 것을 표현한 것이다. 즉, 포인터에 주소를 저장해서 접근하는 것이 가능하다. 그리고 그 포인터들의 주소를 저장하는 이중포인터를 사용하면, 이중포인터 1개로 이차원 배열에 접근할 수 있게 된다.

  1. include <stdlib.h> 추가하여, malloc() 함수 사용
  2. 배열의 주소를 가진 포인터를 저장할 이중포인터 생성
  3. 1차원 배열을 생성할 단일 포인터 생성
  4. 단일 포인터와 이중포인터 모두 free

 위의 과정을 토대로 코드를 작성하면 다음과 같다.

#include<stdio.h>
#include<stdlib.h>

void main() {

	//int arr[3][4];
	int a = 1, row, col;
	
	printf("행의 갯수:");
	scanf_s("%d", &row,sizeof(int));
	printf("열의 갯수:");
	scanf_s("%d", &col,sizeof(int));

	int** dparr;

	dparr = (int**)malloc(sizeof(int*) * row);
	for (int i = 0; i < col; i++) {
		dparr[i] = (int*)malloc(sizeof(int) * col);
	}
	

	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			dparr[i][j] = a++;
		}
	}
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			printf("%4d",dparr[i][j]);
		}
		printf("\n");
	}
	for (int i = 0; i < row; i++) {
		free(dparr[i]);
	}
	free(dparr);
}

 위의 코드를 보면 이중포인터인 "dparr"에  "(int**)malloc(sizeof(int*) * row);"를 저장한다. 이때 "(int**)malloc(sizeof(int*) * row);"은 정수형 포인터의 배열을 동적으로 만드는 명령어이다. 즉, 이중포인터에 1차원 정수형 포인터배열의 주소를 저장하는 과정이 된다. 

 첫번째 for문은 이중포인터 "dparr"에 저장되어 있는 정수형 포인터들에 1차원 정수형 배열의 주소를 각각 저장하는 과정이며, 두번째 for문은 정수형 배열에 데이터를 저장하는 과정이 된다.

위의 과정을 나타낸 그림

 

'프로그래밍 언어 > C언어' 카테고리의 다른 글

구조체 배열  (1) 2023.03.02
구조체 기본  (0) 2023.03.01
동적 메모리 할당 1  (0) 2023.02.25
포인터 배열과 배열 포인터  (0) 2023.02.24
이중 포인터  (0) 2023.02.23
Comments