const char* 질문입니다.
1084
投稿した質問数 57
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
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*의 의미 (포인터의 개념)
- 함수 인자로 넘긴 변수는 별개라는 것
그런데 원래 처음할 땐 헷갈리는 내용인게 당연하니
아래 그림을 참고해서 다시 고민해보시기 바랍니다.
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
541
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
442
1
strcpy() 구현 관련 질문
0
513
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
453
1
클래스 타입의 포인터 질문합니다
0
546
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
498
1
템플릿 특수화 관련 질문
0
385
1
포인터 관련 질문합니다!
0
265
1
Unable to start assembler. Check your settings.
0
831
2
cpu선택
0
539
1
포인터 질문이 있습니다
0
324
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
585
1
iterator 삭제관련
0
406
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
310
1
15 분 45초 대 질문
0
309
0
스택 프레임 질문합니다!
2
306
1
오른값 참조 in 게임
0
384
0
동적할당 질문이 있습니다
0
450
1
안녕하세요 메모리에 대해 질문드립니다.
0
305
1
함수객체 의 매개변수
0
360
1
복사생성자
0
434
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
421
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
355
1
스택 오버플로우
2
790
1

