• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

다중 포인터 질문입니다

23.04.12 13:49 작성 조회수 310

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][지역변수] 이 세가지만 없어지게 되서 그런건가요?

 

 

답변 1

답변을 작성해보세요.

0

5116696님의 프로필

5116696

질문자

2023.04.12

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

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

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

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

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