헤더파일 우클릭 후 문서로 이동하면 헤더파일이 열림
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;
arr.pInt = (int*)malloc(40);
arr.iCount = 0;
arr.iMaxCount = 10;
+
, .
하면 함수 생성 기능이 뜸#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); // 메모리 자동 해제가 안되므로 내가 직접 함수를 통해 해제해줘야함, 메모리누수 방지
#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
}
#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;
}