inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

포인터 마무리

스택프레임 예제에서 주소 관련 질문

262

jyk2367

작성한 질문수 14

0

안녕하세요 루키스강사님

스택프레임은 함수호출이 끝나면 사라지니까

TestPointer 함수에서 a에 대한 주소값을 참조로 넘겨주면 나중에 다른 함수(TestWrong)가 호출됐을 때 영역이 겹쳐 이상한 메모리를 건들 수 있으므로 절대로 넘겨줘서는 안된다는 걸 잘 알겠습니다. 

int* TestPointer() {
	int a=1;
	return &a;
}

void TestWrong(int* ptr) {
	int a[100] = {  };
	a[99] = 0xAAAAAAAA;
	*ptr = 0x12341234;
}

그런데 이 예제에서 *ptr을 매개변수로 받았는데

ptr이 왜 a[100]을 가리키고 있었는지 궁금합니다.

주소를 디버깅해보니 이런식으로 나오더라고요

a 주소 : 0x0113F484

a[99] 주소 : 0x0113F610

ptr 주소 : 0x0113F614

a와 a[99]의 주소는 납득이 가는데 ptr의 주소는 왜 a[99]에서 한칸 더 가있는게 되는 건가요? 

우연이라기엔  다 비슷하게 나오는거 같아서 뭔가 규칙이 있나 싶어 여쭤봅니다

C++

답변 1

0

Rookiss

스택 프레임 특성 때문에 그렇습니다.
호텔 방에 비유하면, 마지막에 체크아웃 한 손님 방을
항상 다음 손님한테 드린다는 규칙이 있다고 가정해봅시다.
그렇다면 공간이 겹치니 새로 입실한 손님은
마지막 체크아웃 한 손님의 흔적(?)을 볼 수 있겠죠.
마찬가지로 마지막 체크아웃 한 손님이
잠시 차 키를 놓고 와서 원래 방에 돌아가보면,
새로운 손님을 볼 수 있겠죠?

TestPointer가 호출 완료되면 TestPointer에서 사용하던 공간을 일단 반납하는데
(그렇다고 해당 메모리 주소를 사용하지 못하는건 아니고.. 스택 프레임 차원에서!)
바로 이어서 TestWrong을 호출했기 때문에,
필연적으로 둘이 기억하고 있던 공간이 어느 정도 겹치고 있는 것입니다.

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

0

561

1

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

0

456

1

strcpy() 구현 관련 질문

0

546

1

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

0

478

1

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

0

562

1

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

0

505

1

템플릿 특수화 관련 질문

0

393

1

포인터 관련 질문합니다!

0

276

1

Unable to start assembler. Check your settings.

0

852

2

cpu선택

0

552

1

포인터 질문이 있습니다

0

336

1

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

0

593

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

442

1

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

0

431

1

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

0

360

1

스택 오버플로우

2

804

1