inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

다중 포인터

다중 포인터 질문입니다

443

5116696

작성한 질문수 6

0

#include <iostream>

using namespace std;

// 다중 포인터

void SetMessage(const char* a)

{

a = "Bye";

}

void SetMessage(const char** a)

{

*a = "Bye";

}

int main()

{

// .rdata [H][e][l][l][o][\0] char형 배열 형태

// main stackframe msg[ Hello주소 ] << 8바이트

const char* msg = "Hello";

// [매개변수][RET][지역변수(msg(Hello주소))] [매개변수(a(Bye주소))][RET][지역변수]

SetMessage(msg);

cout << msg << endl;

// .rdata [H][e][l][l][o][\0] char형 배열 형태

// msg [ Hello주소 ] << 8바이트

// pp[ &msg ] << 8바이트

const char** pp = &msg;

SetMessage(pp);

cout << msg << endl;

return 0;

}

 

메모리를 찬찬히 까보면서 확인했는데

궁금한점이 있어서 글 남깁니다

 

 

1.

void SetMessage(const char** a)

{

*a = "Bye";

}

 

이 부분이 실행되고 난 뒤에 msg의 시작주소가 Hello주소가 아닌 Bye 주소를 나타내고있는데

원래 포인터를 이용하면 해당 주소로 텔레포트 후 그 주소의 데이터에 직접 접근해서

데이터를 변경하는 것으로 알고있습니다

그런데 문자열은 .rdata로 수정불가하기 때문에 단순히 msg가 가리키는 주소만 변경해서

즉, msg의 시작주소가 Hello주소가 아닌 Bye의 시작주소를 가리키게 된건가요?

 

2.

함수 호출이 끝난 뒤에는 Bye주소에 해당하는 값인 문자열 "Bye"는 메모리상에 데이터로 남아있던데

이 데이터가 사라지지 않는 이유를 잘 모르겠습니다.

스택 프레임 구조에서 [매개변수][RET][지역변수] 이 세가지만 없어지게 되서 그런건가요?

 

 

c++

답변 1

0

5116696

1번 질문은 영상을 다시보고나서 생각해보니

*a = "Bye"; 가 실행되고 나면

msg주소 즉, Hello주소가 Bye주소로 바뀌기 때문에 Bye가 출력되는 거였네요..

데이터가 바뀌는게아니라 매개변수로 전달해준 인자 자체가 msg주소였네요

그래서 msg가 가리키는 주소가 바뀐거고..

소스코드와 관련하여 질문드립니다

0

70

1

map 컨테이너의 emplace 함수에 대해

0

114

2

시작이 안되네요...!

0

97

2

EAX 명령어 실행 시 RAX의 상위 32비트가 초기화 되는 이유

0

126

1

리틀 엔디안 장점 질문합니다.

0

131

1

메모리 창에 주소를 넣었는데 영어 꺠짐

0

124

1

타입변환#2 build시 knight 인접 stack이 침범당했다는 error가 발생합니다.

0

94

2

map #1 8분 58초 맵은 레드블랙트리로 이루어진 것 같습니다.

1

139

2

hello world 부터 오류 ㅠㅜ

0

189

1

지역변수가 스택? 레지스터

0

132

2

마지막 문제 질문드립니다.

0

165

2

메모리창이 비활성화됩니다.

0

98

1

이중포인터 강좌 부분 질문있습니다.

0

145

1

2를 더하는 이유

0

133

1

메모리 주소 창 엔디안 질문 드립니다. 인프런 봇 답변도 괜찮습니다

1

111

1

해당 코드는 왜 오류가 날까요?

0

156

1

마지막 문제 질문 있습니다.

0

119

1

강의 마지막부분에 질문이 있습니다.

0

192

2

Field초기화

0

141

1

virtual과 override 차이

0

315

2

3:30 참조자 리턴

0

168

1

map 찾기

0

158

1

프로그램 질문드려요

0

260

1

캐스팅 질문

0

138

1