[ 동적할당 ]
- 메모리 영역의 종류
>> 스택 : 지역 변수
>> 데이터 : 전역, 정적, 외부(데이터) 변수
>> ROM : 코드
>> 힙 : 동적할당
- 특징
>> 런타임 중에 대응 가능
>> 사용자가 직접 관리해야함 ( 직접 해제 필요)
// 동적할당 설명
#include <stdio.h>
int main(){
// 메모리 영역
// 1. 스택 : 지역 변수
// 2. 데이터 : 전역, 정적, 외부(데이터) 변수
// 3. ROM : 코드
// 4. 힙 : 동적 할당
int* pInt = (int*)malloc(100);
// malloc(N) : N개의 Byte에 대하 주소를 받음
// 힙 영역에 N Byte 입력
// malloc 는 Byte에 대한 주소값만 제시함
// 이 주소값을 어떤 자료형으로 해석할 지는 미지수
// (int*)로 하여서 주어진 주소값을 int값으로 볼 것이라고 제시
free(pInt)
// Byte 할당 해제
return 0;
}
[ 가변 배열 ]
일반적인 배열
>> 메모리의 크기 고정
가변 배열
>> 메모리의 크기가 고정되어있음
>> 동적으로 메모리 크기를 변경시켜서 크기가 변할 수 있는 배열로 존재할 수 있게 해줌
// main.cpp
#include <stdio.h>
// printf, scanf_s 등등을 사용하기 위한 라이브러리
#include <cstdlib>
// free : 메모리 해제를 사용하기 위한
// 가변배열 구조체 선언
typedef struct _tabArr{
int* pInt;
int iCount;
int iMaxCount;
}_tArr;
// 가변배열 관련 함수 선언
void Init(_tArr* _pArr){
_pArr->pInt = (int*)malloc(sizeof(int)*2);
_pArr->iCount = 0;
_pArr->iMaxCount = 2;
}
// 초기화 함수
void Release(_tArr* _pArr){
free(_pArr->pInt);
_pArr->iCount = 0;
_pArr->iMaxCount = 0;
}
// 해제 함수
void Resize(_tArr* _pArr){
_pArr->iMaxCount *=2;
int* _pNew = (int*)malloc(_pArr->iMaxCount*sizeof(int));
for(int I=0; I < _pArr->iCount ; ++I){
_pNew[I] = _pArr->pInt[I];
}
free(_pArr->pInt);
_pArr->pInt = _pNew;
printf("Size UP : %d\n",_pArr->iMaxCount);
}
// 크기 변경 함수
void PushBack(_tArr* _pArr, int Data){
if (_pArr->iCount >= _pArr->iMaxCount){
Resize(_pArr);
}
_pArr->pInt[_pArr->iCount++] = Data;
}
// 데이터 입력 함수
int main(){
_tArr S={};
Init(&S);
// _tArr*의 타입으로 들어가야하기에, &(Reference)를 사용
for (int i =0; i<10 ; i++){
printf("%d\n",i);
PushBack(&S,i);
// _tArr*의 타입으로 들어가야하기에, &(Reference)를 사용
}
for (int i=0; i<S.iCount; i++){
printf("%d\n",S.pInt[i]);
// _tArr->pInt로 접근
}
Release(&S);
// _tArr*의 타입으로 들어가야하기에, &(Reference)를 사용
return 0;
}
'C++ > 기본 문법' 카테고리의 다른 글
void 포인터 (0) | 2022.06.30 |
---|---|
포인터 && const (0) | 2022.06.30 |
배열 && 구조체 (0) | 2022.06.30 |