동적 메모리 할당
변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당받는 방식입니다. C에서는 malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환합니다.
C++에서는 new 연산자를 사용합니다. new 연산자는 생성된 객체의 주소를 반환합니다.
malloc 함수
int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
if (p = NULL) {
/*동적 메모리 할당이 실패*/
/*적절한 조치를 취한다.*/
}
p[0] = 12;
p[1] = 24;
*(p + 2) = 36;
배열 재할당
동적으로 생성된 배열은 공간이 부족할 경우 더 큰 배열을 생성하여 사용할 수 있습니다.
int *array = (int *)malloc(4*sizeof(int));
/* 배열 크기가 부족한 상황을 가정하자. */
int *tmp = (int *)malloc(8*sizeof(int));
for(int i=0; i<4; i++)
tmp[i] = array[i];
free(array);
array = tmp;
크기가 8인 배열을 추가적으로 할당받습니다. 별개로 32비트인 메모리를 할당받아서 tmp라는 새로운 변수에다가 저장을 합니다. 그런 다음 이 array 안에 있는 데이터를 tmp의 할당받은 데이터로 복사를 합니다.
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int* p = new int[n];
p[0] = 12;
p[1] = 24;
*(p + 2) = 36;
delete[] p;
return 0;
}
malloc과 달리 byte 단위가 아닌 배열의 크기를 지정합니다. (n)
new 연산자는 동적 생성된 배열의 첫 칸의 주소를 반환합니다. 보통의 배열처럼 사용하면 됩니다.
C와 C++에서의 메모리 관리
전역변수
함수의 외부에 선언된 변수들이며 프로그램이 시작될 때 메모리가 할당되며 프로그램이 종료될 때까지 유지됩니다. 데이터 섹션이라고 부르는 메모리 영역에 위치해있습니다.
지역변수
함수의 내부에 선언된 변수들이며 자신이 속한 함수가 호출될 때 메모리가 할당되며 함수가 return될 때 소멸됩니다. 스택이라고 부르는 영역에 위치해있습니다.
동적 메모리 할당 / 동적 생성 객체
malloc 혹은 new 연산자로 필요한 크기의 메모리를 할당/동적 객체 생성합니다. 동적으로 할당된 메모리는 힙(heap)이라고 부르는 영역에 할당됩니다. 동적으로 할당된 메모리는 free함수(C) 혹은 delete(C++)로 삭제하지 않은 한 계속해서 존재합니다.
'IT 프로그래밍 > 자료구조' 카테고리의 다른 글
[C++] string 클래스와 getline 사용법 (0) | 2024.09.06 |
---|---|
[C언어] 문자열 string, fgets 설명 (0) | 2024.09.06 |
텐서플로우와 Linear regression, Cost function (1) | 2024.09.03 |
포인터, 배열, 포인터 산수 (0) | 2024.09.02 |
포인터에 관한 기본적인 개념 설명 및 예제 (0) | 2024.09.02 |