36. 가변배열 코드 (1)

P4·2023년 6월 15일
0
post-thumbnail

가변배열 (2)

  • 헤더파일 우클릭 후 문서로 이동하면 헤더파일이 열림

  • int a[100]를 선언했는데 101번째 자료를 넣고싶으면? 일반적인 배열로는 불가능함 --> heap 메모리를 이용해서 가변배열로 만들면 됨


가변배열의 원리 파악

  • 구조체는 자료형이라 크기가 고정된 이 안에 가변배열을 갖고있을 수는 없음, 따라서?

  • 구조체는 멤버로 heap 메모리 상의 영역을 가리키는 주소값을 갖고 있어야 됨!

  • 구조체는 안바뀌고 heap은 바뀌니 heap에 저장하기 위해 주소를 받아온다고 생각하면 됨


가변배열의 구조

  • 헤더 코드
#pragma once

typedef struct _tagArr
{
	int* pInt; // 저장할 heap 메모리 영역의 주소값을 받아오기 위한 포인터 변수
	int iCount; // 다음에 저장할 자료위치를 알기위해 현재까지 데이터가 얼마나 저장됐는지 기록하는 변수
	int iMaxCount;
    // malloc(400)으로 선언했는데 101번째 자료가 들어간다?
    // 그럼 메모리영역을 늘려야 함, 그 타이밍을 파악하기 위해 한계치를 적어놓는 변수
    // 위의 3개는 필수 멤버, 없어선 안됨

}tArr;
  • cpp 코드
    arr.pInt = (int*)malloc(40);
	arr.iCount = 0;
	arr.iMaxCount = 10;
  • 단축키 ctrl + +, . 하면 함수 생성 기능이 뜸


헤더

#pragma once

typedef struct _tagArr
{
	int* pInt; // heap 메모리 주소값
	int iCount; // 데이터가 몇개 있는지
	int iMaxCount; // 현재 가변배열의 최대 크기가 몇인지

}tArr;

// 배열 초기화 함수
void InitArr(tArr* _pArr); // 가변배열의 초기값 세팅

// 데이터 추가 함수
void PushBack(tArr* _pArr, int _iData); // 가변배열에 데이터를 추가하는 함수

// 공간 추가 확장
void Reallocate(tArr* _pArr); // 2개만 넣는다고 했는데 10개가 들어가면? 2개가 들어간 뒤 얘가 호출돼서 크기를 늘려줘야 함

// 배열 메모리 해제 함수
void ReleaseArr(tArr* _pArr); // 메모리 자동 해제가 안되므로 내가 직접 함수를 통해 해제해줘야함, 메모리누수 방지


헤더 함수 구현 cpp

#include "Arr.h"
#include <iostream>

void InitArr(tArr* _pArr)
{
	_pArr->pInt = (int*)malloc(sizeof(int) * 2); // int 자료형을 2개 넣겠다고 초기에 선언한 것
	_pArr->iCount = 0; // 당연히 처음 데이터의 개수는 0, 하나 넣을때마다 증가함
	_pArr->iMaxCount = 2; // int 자료형이 2개 들어가니 당연히 iMaxCount도 2

}

void Reallocate(tArr* _pArr)
{
	// 다음글에 이어짐...
}

void PushBack(tArr* _pArr, int _iData)
{
	/* 힙 영역에 할당한 공간이 다 참
	최대 저장 개수가 현재 저장된 개수와 같아짐 ~ 작아짐 상태가 되면
	그게 당연히 가득찬거임 */
	if (_pArr->iMaxCount <= _pArr->iCount)
	{
		// 재할당
		Reallocate(_pArr);
	}

	// 데이터 추가
	_pArr->pInt[_pArr->iCount++] = _iData;

	/* 현재 인덱스에 데이터를 추가, 데이터를 추가한 뒤 후위 연산자로 인해
	문장이 끝날때 iCount가 1증가 */
}

void ReleaseArr(tArr* _pArr) // 완전 리셋 되는거임
{
	free(_pArr->pInt); // 메모리 블록을 해제하고 해당 메모리 블록을 사용가능한 상태로 돌려줌
	_pArr->iCount = 0; // 데이터 개수는 0
	_pArr->iMaxCount = 0; // 최대 저장 개수도 0
}


실제로 쓰이는 main 함수

#include <stdio.h>
#include <iostream>

#include "Arr.h"

int main(void)
{
	tArr arr = {};
	
	InitArr(&arr);

	for (int i = 0; i < 10; ++i)
	{
		PushBack(&arr, i);
	}

	ReleaseArr(&arr);

	return 0;
}
profile
지식을 담습니다.

0개의 댓글