작성
·
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
0
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
고민을좀 해보고 내린 결론인데 이게 맞는건지 잘 모르겠습니다
처음 함수로 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
여러가지 개념을 혼동하고 계신 것 같네요.
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*의 의미 (포인터의 개념)
- 함수 인자로 넘긴 변수는 별개라는 것
그런데 원래 처음할 땐 헷갈리는 내용인게 당연하니
아래 그림을 참고해서 다시 고민해보시기 바랍니다.