[ 동적할당 ]

- 메모리 영역의 종류

  >> 스택 : 지역 변수

  >> 데이터 : 전역, 정적, 외부(데이터) 변수

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

+ Recent posts