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일지

동적 메모리 할당 1 본문

프로그래밍 언어/C언어

동적 메모리 할당 1

세레프 2023. 2. 25. 05:16

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


 그렇다면 동적메모리를 사용하는 이유는 뭘까? 정적메모리는 프로그램이 실행되기 전에 코딩된 크기만큼 할당된다. 이러한 크기는 실행중에는 변경이 불가능하다. 따라서 크기를 변경하기 위해서는 코드를 일일히 바꿔야 하며, 사용하지 않는 메모리가 발생하여 효율적이지 못하다.  그래서 동적메모리를 사용함으로써, 프로그램이 실행되고 있는 순간에도 사용자가 사용할 배열의 크기만큼 지정하여 메모리를 좀 더 효율적으로 사용 할 수 있다.

 

동적 메모리 할당 - 1차원 배열 만들기

 이제 동적 메모리를 통해 배열을 만드는 구조에 대해서 알아보자

  #include

void main(){
    자료형 *pa();
    pa = (자료형*)malloc(sizeof(자료형)*만들 변수의 수); 
    free(pa) 
}

 

 <stdlib.h>는 문자열 변환, 동적메모리관리 등의 함수를 포함하는 c언어 라이브러리중 하나로, malloc 함수와 free명령어를 사용하기 위해 불러오는 라이브러리이다.

 

 malloc함수메모리를 동적할당할 때 사용하는 함수로, ()안에 적힌 자료형의 크기 또는 숫자의 byte크기 만큼 메모리를 할당받는다. 이때 할당 받은 배열의 이름은 존재하지 않으며, 할당 받은 배열의 시작 주소를 반환하는 함수이다. 그래서 시작주소를 저장할 포인터를 생성하여 포인터에 주소를 저장하며, 포인터 변수를 통해 배열의 요소에 접근한다..


 free명령어는 프로그램이 종료할 때, 동적 할당 받은 메모리 해제하기 위해 사용하는 명령어이다. free명령어를 사용하는 이유는 동적으로 생성된 변수나 배열은 자동적으로 회수가 되지 않기 때문이다.

 

 free명령어를 사용하는 이유에 대해 설명하자면 다음과 같다.

 정적 할당 변수는 스택영역변수(지역변수,매개변수), 데이터영역변수(전역변수)로, 선언하는 동시에 메모리에 정해진 공간만큼 할당되기에 사용주기가 정해진다. 하지만 동적 할당 변수는 힙영역 변수에 속하며, 공간을 선언하게 되면 메모리공간에 직접 할당해야 해서 사용주기가 정해지지 않는다. 그래서 저장공간(메모리)를 재활용하기 위해서는 사용주기를 정해 줘야 한다.

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

void main() {
	int* pa;
	int sum = 0, i, j;
	float avg;
	printf("입력할 정수의 개수:");
	scanf_s("%d", &j, sizeof(int));
	pa = (int*)malloc(sizeof(int) * j);
	for (i = 0; i < j; i++) {
		printf("%d번째 정수입력:", i + 1);
		scanf_s("%d", &pa[i], sizeof(int));
		sum = sum + pa[i];

	}
	free(pa);
	avg = sum / (float)j;
	printf("sum:%d\n", sum);
	printf("avg=%5.3f\n", avg);

}

 위의 코드는 동적 할당 메모리의 사용 예시이다. malloc함수를 보면, 할당받을 메모리의 크기로 "sizeof(int)*j"가 적혀져 있다. 이는 입력할 정수의 개수만큼 저장공간을 할당 받겠다는 것이며, 이는 입력할 수 있는 정수형 변수의 개수를 만들겠다는 것이다.

 추가적으로 "(int*)"이라는 형 변환이 적혀있는데, 이는 malloc함수의 결과값은 void형 포인터(void *)이기 때문이다.

 

자료형 void
 void형 타입이 정해져 있지 않은 자료형으로, 해당 자료형으로 만들어진 변수의 메모리 주소는 시작 주소만 소유하고 있다. 즉, 저장공간의 크기가 정해져 있지 않아서, 저장하려는 값의 자료형에 맞는 포인터 형으로 변환해서 사용해야 한다. 그래서, 정수형 포인터에 저장하기 위해서 결과값을 정수형으로 변환하는 것이다.

 

 

 


C언어의 메모리 영역

 C언어에는 프로그램에 필요한 정보를 저장하기 위한 여러가지 메모리 영역이 존재한다.

  • 코드 영역 : 실행할 소스코드가 저장되는 영역으로, 함수, 제어문, 상수 등이 여기에 저장이 된다. 해당 영역에 속해져 있는 것은 메모리의 주소를 출력할 수 없다.
  • 데이터 영역 : 프로그램이 시작되고 종료될 때까지 사용하는 변수를 저장하는 영역으로, 전역변수가 여기에 저장된다.
  • 힙 영역 : 필요에 따라 생성되는 변수를 저장하는 영역으로, 동적 메모리 할당으로 생성된 변수가 여기에 저장된다.
  • 스택 영역 : 함수가 호출되고 종료될 때까지 사용하는 변수를 저장하는 영역으로, 지역변수, 매개변수가 여기에 저장된다.

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

구조체 기본  (0) 2023.03.01
동적 메모리 할당 2  (0) 2023.02.28
포인터 배열과 배열 포인터  (0) 2023.02.24
이중 포인터  (0) 2023.02.23
함수와 포인터  (0) 2023.02.22
Comments