구조체 안의 멤버로 배열의 경우 변수를 통해서 선언이 가능? => ㄴㄴ.
무슨 문제가 생기나?
만약 멤버로 int value1 ,float value2;
이렇게 있으면 메모리에 [ 4바이트 ][ 4바이트 ] 이렇게 있는데
고정된 크기의 상수로 배열을 선언해주지 않으면
[ ?바이트 ] 이렇게 될 것임... => main함수가 동작할 때 컴파일러가 미리 어느정도의 메모리 공간이 필요하겠군..이라고 계산을 하는 것이라 안된다.
가변 배열의 기능을 할 수 있는 자료형을 만들고
각각의 객체들을 만들었을 때, 이안에 데이터를 저장하는게 가능할까 안 가능할까?
이렇게 100개짜리 멤버로 만들고 == 400바이트
이렇게 가능함.
그런데 101번째 배열을 넣고 싶으면 우짜노??
실행 도중에 언제든지 메모리를 내가 원하는 만큼 그때그때 요청할 수 있는 곳은??
=> "힙 메모리" 동적할당. malloc(); 함수.
내가 지금 s라는 객체한테 데이터를 저장시키는 것이 아니라,
- 내생각에는 나의 자료형에는 malloc함수를 통하여
- -> 입력받은? 크기만큼의 배열의 크기를 선언해서 malloc함수에 전달해서
- malloc함수가 전달해준 주소를 s라는 객체가 들고있어서
- s.arr했을때 원하는 만큼의 크기의 주소를 가질거 같다.
창고 주인은 물건을 받아서 창고에 넣어 두고 내가 필요할 때 말하면 집으로 배송해준다.
s가 배열 객체야(창고 주인이야), 근데 내가 이녀석한테 데이터(물건)을 넘겨 줄 꺼야,
근데 s가(창고주인이) 데이터(물건)을 저장하는 것은 불가능하다매 (배열 동적 할당 안되서)
그러면 s에게 데이터를 주면 어디다가 저장을 하겠노? => 힙메모리.
그래서 이 녀석은 멤버로 뭐가 있어야 하나?
그래, 주소값이 있어야 한다.
pInt는 뭘 가지고 있어야 하나??
데이터를 저장시킬 첫 주소를 가지고 있어야한다. 근데 이거 하나만으로는 부족하다.
데이터를 차곡차곡 넣을 때 몇번째 자리부터 시작해야지 알 수 있을까?
iCount라는 애가 필요해 보인다.
그리고 한계치를 알아야 하지 않을까??
그래야 몇바임트만큼 더 필요하다 했을 경우 arr.h에서 정의한 자료형안에 필드가
"인지"를 할 것이니까.
이렇게 가변배열이라는 기능을 하기위해서 멤버로 3가지를 가지고 있어야한다.
그래서 이렇게 해줄 수 있는데 그러면 이 자료형 선언할 때마다 이렇게 생각을해서 한다, 반복된다. => ㅈㄴ 귀찮다 => 함수화
지금 s를 초기화 해줄려는데 s가 있는 곳은 main 함수의 지역안에 있는 녀석이다.
그러면 s한테 접근을 할려면 어떻게 해주어야 하나?? => 주소를 넘겨주어야 한다.
Array헤더에는 정의만 해주고 arr.cpp에서 선언을 해줄 것이다.
함수선언한 곳에서 정의부 만드는 단축키는 Ctrl + '+' + '.' 이다.
일단은 8바이트로 만들어준는데 의도를 명확히 하기 위해서 sizeof 사용한다.
이렇게 필요함.
이런상황인데 TARR s의 메모리는 언제 해제됨?
main함수 끝나면 => 신경 안 써도된다.
if로 확인해주는 이유는 이렇게 공간이 다 차있을 수 있기 때문에 확인해주고
재할당 해주어야 한다.
데이터를 넣을 경우에는 arr->arrAddr[arr->arrCount++] = data;
arrAddr의 주소의 인덱스에 arrCount 인덱스 번으로 접근을 하고 그곳에 데이터를 넣고나서, (입력값 data할당이 끝나고 나서)
후위연산자로 1 증가.