CPP_어소_44_가변배열 (2)

CJB_ny·2022년 6월 25일
0

CPP_AROTHO

목록 보기
42/83
post-thumbnail

구조체 안의 멤버로 배열의 경우 변수를 통해서 선언이 가능? => ㄴㄴ.

무슨 문제가 생기나?

만약 멤버로 int value1 ,float value2;

이렇게 있으면 메모리에 [ 4바이트 ][ 4바이트 ] 이렇게 있는데

고정된 크기의 상수로 배열을 선언해주지 않으면

[ ?바이트 ] 이렇게 될 것임... => main함수가 동작할 때 컴파일러가 미리 어느정도의 메모리 공간이 필요하겠군..이라고 계산을 하는 것이라 안된다.

데이터를 객체 안에

가변 배열의 기능을 할 수 있는 자료형을 만들고

각각의 객체들을 만들었을 때, 이안에 데이터를 저장하는게 가능할까 안 가능할까?

이렇게 100개짜리 멤버로 만들고 == 400바이트

이렇게 가능함.

그런데 101번째 배열을 넣고 싶으면 우짜노??

ROM 읽기 전용 메모리

실행 도중에 언제든지 메모리를 내가 원하는 만큼 그때그때 요청할 수 있는 곳은??

=> "힙 메모리" 동적할당. malloc(); 함수.

내가 지금 s라는 객체한테 데이터를 저장시키는 것이 아니라,

  1. 내생각에는 나의 자료형에는 malloc함수를 통하여
  2. -> 입력받은? 크기만큼의 배열의 크기를 선언해서 malloc함수에 전달해서
  3. malloc함수가 전달해준 주소를 s라는 객체가 들고있어서
  4. s.arr했을때 원하는 만큼의 크기의 주소를 가질거 같다.

Self Storage

창고 주인은 물건을 받아서 창고에 넣어 두고 내가 필요할 때 말하면 집으로 배송해준다.

s가 배열 객체야(창고 주인이야), 근데 내가 이녀석한테 데이터(물건)을 넘겨 줄 꺼야,

근데 s가(창고주인이) 데이터(물건)을 저장하는 것은 불가능하다매 (배열 동적 할당 안되서)

그러면 s에게 데이터를 주면 어디다가 저장을 하겠노? => 힙메모리.


그래서 이 녀석은 멤버로 뭐가 있어야 하나?

그래, 주소값이 있어야 한다.

pInt는 뭘 가지고 있어야 하나??

데이터를 저장시킬 첫 주소를 가지고 있어야한다. 근데 이거 하나만으로는 부족하다.

데이터를 차곡차곡 넣을 때 몇번째 자리부터 시작해야지 알 수 있을까?

iCount라는 애가 필요해 보인다.

그리고 한계치를 알아야 하지 않을까??

그래야 몇바임트만큼 더 필요하다 했을 경우 arr.h에서 정의한 자료형안에 필드가

"인지"를 할 것이니까.

이렇게 가변배열이라는 기능을 하기위해서 멤버로 3가지를 가지고 있어야한다.

그래서 이렇게 해줄 수 있는데 그러면 이 자료형 선언할 때마다 이렇게 생각을해서 한다, 반복된다. => ㅈㄴ 귀찮다 => 함수화

가변배열 초기화

지금 s를 초기화 해줄려는데 s가 있는 곳은 main 함수의 지역안에 있는 녀석이다.

그러면 s한테 접근을 할려면 어떻게 해주어야 하나?? => 주소를 넘겨주어야 한다.

Array헤더에는 정의만 해주고 arr.cpp에서 선언을 해줄 것이다.

단축키

함수선언한 곳에서 정의부 만드는 단축키는 Ctrl + '+' + '.' 이다.

일단은 8바이트로 만들어준는데 의도를 명확히 하기 위해서 sizeof 사용한다.

필요한 기능들 구현

이렇게 필요함.

해제

이런상황인데 TARR s의 메모리는 언제 해제됨?

main함수 끝나면 => 신경 안 써도된다.

Push (후위 연산자)

if로 확인해주는 이유는 이렇게 공간이 다 차있을 수 있기 때문에 확인해주고

재할당 해주어야 한다.

데이터를 넣을 경우에는 arr->arrAddr[arr->arrCount++] = data;

arrAddr의 주소의 인덱스에 arrCount 인덱스 번으로 접근을 하고 그곳에 데이터를 넣고나서, (입력값 data할당이 끝나고 나서)

후위연산자로 1 증가.

할당

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글