inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

타입 변환 #4

17:50 포인터 배열 질문

195

starkshn

작성한 질문수 134

0


int arr[3] = {};

이것은 정수형 배열이라 전체 크기는 12바이트 이고 0번째 주소값을 4바이트로 크기를 할당한 것.

int* arr2[3] = {};

이것은 포인터 배열(정수형)

이고 0번째 주소부터 접근을 하면

그곳에는 정수형으로 해석할 주소값이 들어가있다라는 의미.
(어떠한 정수형 데이터의 주소값이 있을 것.)

이렇듯 배열도 배열의 자료형 == 타입(크기)과 들어올 데이터의 자료형 == 타입(크기)이 일치 해야 하는데

이해가 안가는 부분이 현재


- Itme 클래스 크기
sizeof(Item) = _itemType(4), _ ItemDbid(4), _dummy(4096) => 4104Byte


- Weapon 클래스 크기
sizeof(Weapon) = sizeof(Item) + _damage(4) => 4108Byte

- Armor 클래스 크기
sizeof(Weapon) = sizeof(Item) + _defense(4) => 4108Byte

이상태에서

rand값에 따라 switch 분기를 하여 1이 나왔을 경우

Item[0] = new Weapon를 해주게 되는데

이럴경우 아까 포인터 배열과 똑같이 해석을 하면

"0번째 주소부터 접근을 하면 그곳에는 Itme으로 해석할 주소값이 들어가있다라는 의미."

파생 클래스의 메모리 구조는 직렬형태라

[Item클래스 시작 주소값] [Weapon클래스 시작 주소값]

형태라 Weapon을 동적할당하여 Item 포인터 배열에 데이터를 넣을 수 있는 것 까지는 이해하였습니다.

그런데

4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니

Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요?

 

(Weapon클래스의 _damage 부분이 짤렷으니)

 

(추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생)

 

그래서 타입변환 5 강의에서 다시 for 문안에서

nullptr체크를 해준다음에

ItemType에 따라서

(Weapon*)item; 이렇게 형변환하여 Weapon의 멤버 변수에도 접근을 할 수 있게 해준 것인가여요?

아니면 제가 아예 다르게 이해를 하고있는것인지 여쭤보고 싶습니다 :)

C++

답변 1

1

Rookiss

4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니
Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요?
(Weapon클래스의 _damage 부분이 짤렷으니)

네 문법적으로 안 됩니다. 아이템 클래스의 Item* 으로 인식하고 있니깐요.

(추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생)

네 맞긴 하지만, 정확히 말하면
메모리 침범 = 메모리 오염은 아닙니다.

원본 객체가 Weapon타입이 맞다면, 딱히 메모리 오염은 아니겠죠.
형변환을 해서 접근하거나, 포인터 주소값 덧셈을 이용해서
Weapon에 해당하는 메모리를 사용해도 괜찮지만
정말 정말 정말 Knight 타입이 맞는지 확실한 상태에서 진행해야 할 것입니다.
(dynamic_cast을 한다거나, Item의 타입을 별도로 변수로 넣어준다거나..)

0

starkshn

아넵 이해되었습니다! 감사합니다~

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

561

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

456

1

strcpy() 구현 관련 질문

0

543

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

477

1

클래스 타입의 포인터 질문합니다

0

560

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

505

1

템플릿 특수화 관련 질문

0

392

1

포인터 관련 질문합니다!

0

276

1

Unable to start assembler. Check your settings.

0

851

2

cpu선택

0

552

1

포인터 질문이 있습니다

0

335

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

592

1

iterator 삭제관련

0

419

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

319

0

스택 프레임 질문합니다!

2

316

1

오른값 참조 in 게임

0

394

0

동적할당 질문이 있습니다

0

460

1

안녕하세요 메모리에 대해 질문드립니다.

0

314

1

함수객체 의 매개변수

0

370

1

복사생성자

0

441

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

431

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

360

1

스택 오버플로우

2

804

1