인프런 커뮤니티 질문&답변

jyk2367님의 프로필 이미지
jyk2367

작성한 질문수

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

포인터 마무리

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

작성

·

209

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]에서 한칸 더 가있는게 되는 건가요? 

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

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

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

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

jyk2367님의 프로필 이미지
jyk2367

작성한 질문수

질문하기