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

Windfall님의 프로필 이미지
Windfall

작성한 질문수

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

다중 포인터

const char* 질문입니다.

작성

·

916

0

main함수내에서

const char* p = "Hello"

p = "Bye"하면

바로 p내용이 바뀌는데

왜 함수에서는 안되는지 궁금해서

여러가지  실험을 해보니까

cont char* p = "Hello"에서

cout << p << endl; 을하면

"Hello"가나오고

cout << *p << endl; 을 하니까

'H'가나오더라구요?

*p = p[0]이런 모양새라

SetMessage함수에서 *p = "Bye"하면 const 때문에 못바꾸고

p = "Hello"니까

p = "Bye"하면 이건 바뀌어야맞는거 아닌가? 싶어서요

main함수에서는 잘만 바뀌는데 SetMessage함수에서는 또 안되고

이게 왜이런거죠 도저히 이해가 안됩니다.

 

 

 

답변 4

0

Windfall님의 프로필 이미지
Windfall
질문자

감사합니다!

0

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

1.
네 맞습니다.
이런 부분은 꼭 breakpoint를 걸고 메모리를 까보시면서 학습해보시기 바랍니다.
(그래야 오래 남습니다)

 

2.
그건 char* p1이나 char p1[]의 문제라기보다는
뒤에 오는 "Hello"의 특성 때문인데요.
"Hello" 이렇게 하면 .rdata 영역에 H e l l o 문자가 박히고
해당 주소를 p1이 참조하게 됩니다.

반면 char p1[] = "Hello"; 이렇게 하면
char타입의 배열이 만들어지면서 내용물이 Hello로 채워지게 됩니다.
이 때 "Hello"는 rdata 영역에 들어가는게 아니라,
스택 영역에 만들어진 p1 배열을 순차적으로 H e l l o로 초기화합니다.


0

Windfall님의 프로필 이미지
Windfall
질문자

고민을좀 해보고 내린 결론인데 이게 맞는건지 잘 모르겠습니다

처음 함수로 msg늘 넘겨줬을 때는

char* a, char* msg 둘 다 Hello를 가리키고 있지만

*a = "Bye"는 

const 때문에 "Hello"자체를 수정 할 수가없어서

a = "Bye"로 a가 가리키는 주소를 바꾸려고 시도하면?

char* msg 는 그대로 "Hello"를 가리키고 있지만

char* a 만 "Bye"를 카리키게 된다.

여기서 질문이

1. char* msg, char* a가 함수로 포인터를 넘겨줬을 때

둘 다 "Hello"를 가리키고 있는게 맞는지요?

 

이건 좀 다른 질문인데

2. char* p1 = "Hello"로 하니까 const char*로 해라 라고 오류가 뜨더라구요

그래서 char p1[] = "Hello" 이걸로 해보면 오류가 안나고

char p1[] 나 char* p1이나 똑같은거간은데 왜 한쪽에서만 오류가나고

왜 문자열을 쓰려면 const char*로 해야하는지 궁금합니다

 

0

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

여러가지 개념을 혼동하고 계신 것 같네요.

const char* p = "Hello"
p = "Bye"하면
바로 p내용이 바뀌는데

char*는 char 타입의 포인터입니다.
따라서 p라는 바구니 안에는 주소값이 들어 있고
그 주소를 타고 가면 char가 있는 상태이죠.
다만 문자열 특성상 사실은 char가 1개만 있지 않고 연이어서
여러개가 줄지어 있는 상태입니다.

p = "Bye"
를 하면 주소를 담는 p라는 바구니에
'B', 'y', 'e'라는 문자가 위치한 주소가 담기게 됩니다.

cout << p << endl; 을하면 "Hello"가나오고
cout << *p << endl; 을 하니까 'H'가나오더라구요?

p는 주소값이지만 cout 특성상 char* 이면 문자열로 인식해 해당 주소로 가서
NULL 바이트가 나올 때까지의 문자를 출력하기에 "Hello"가 출력되는 상황입니다.
그리고 *p 즉 p를 타고 가면 char가 있으니 'H'가 출력되는게 정상적인 상황입니다.

SetMessage함수에서 *p = "Bye"하면 const 때문에 못바꾸고
p = "Hello"니까 p = "Bye"하면 이건 바뀌어야맞는거 아닌가? 싶어서요

네 분명히 바뀐게 맞습니다.
문제는 교체한 a = "Bye";의 a가
함수 인자로 받은 const char* a이라는 것입니다.
[스택 프레임] 강의를 이해하셨다면, 함수를 호출할 때 
스택 프레임에 인자들을 복사해서 전달한다는 내용이 나왔을텐데요.
여기서 SetMessage(const char* a)의 a는 원본이 아니라 복사된 값입니다.
char* 는 char타입 포인터이니 단순 주소를 담는 바구니이구요.
원래 "Hello"문자를 가리키는 주소를 담고 있었는데,
a = "Bye"에 의해 새로운 주소를 가리키게 교체 되었지만
어디까지나 이 아이는 원본이랑은 별개로
스택에 들어간 함수 인자 쪽 변수이기 때문에
main 쪽의 원본에는 영향을 주지 못하는 것입니다.
SetMessage 내부에서 cout << a << endl;를 하면 교체된걸 확인할 수 있습니다.

결론적으로, 2가지 부분을 헷갈려 하시는 것 같네요.
- char*의 의미 (포인터의 개념)
- 함수 인자로 넘긴 변수는 별개라는 것

그런데 원래 처음할 땐 헷갈리는 내용인게 당연하니
아래 그림을 참고해서 다시 고민해보시기 바랍니다.

Windfall님의 프로필 이미지
Windfall

작성한 질문수

질문하기