작성
·
103
1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
수업 예제 중에
int x=5;
double d=123.0;
int *ptr_x=&x;
double *ptr_d=&d;
cout << ptr_x << endl;
cout << *ptr_x << endl;
cout << ptr_d << endl;
cout << *ptr_d << endl;
의 결과가
주소
5
주소
123
으로 나왔는데
왜 x와 d의 주소가 같은가요?
int x 의 주소가 004FF7F8이면 그 다음 선언한 변수 double d는 004FF7FC가 되어야하지 않나요??
*ptr_d를 프린트 했을 때 소수점도 나와야하지 않나요? 0이면 소수점은 아예 생략되나요?
답변 3
1
0
안녕하세요, 질문&답변 도우미 durams입니다.
두 주소가 같다는 말씀이 강의 영상에서 보여준 주소인지, 직접 실행했을때 출력된 주소인지 둘 중 어느 것을 말씀하시는지는 확실하지 않으나, 일단 해당 예제에서 두 포인터 변수 ptr_x
와 ptr_d
는 각각 다른 변수의 주소를 담고 있으므로, 출력 시에도 다른 주소가 나타나야 합니다.
강의 영상에서는 ptr_x
의 출력으로 004FF7F8
이, 그리고 ptr_d
의 출력으로 004FF7E8
이 나오고 있습니다. (혹시 동일한 주소가 나타났다면 코드를 첨부해주세요!)int x
의 주소가 004FF7F8
일 때, 다음 선언한 변수 double d
의 주소가 4바이트 뒤인 004FF7FC
가 되어야 하지 않느냐는 질문에 대해서 별개로 말씀드리자면, 반드시 그렇게 되지는 않습니다.
7.10 스택과 힙에서 배울 내용에 대해 약간 미리 언급을 드리자면, 지역 변수는 스택이라는 메모리 공간에 할당이 됩니다. 이때 빈 공간이 아예 없도록 할당되기보다는 여러가지 이유로 인해(정렬, 컴파일러 최적화 등) 변수들 사이에 공간의 여유를 두거나, 메모리 상의 순서가 바뀌는 경우가 생깁니다.
저도 비주얼 스튜디오에서 테스트를 해봤는데요, 두 주소값 간에 x86 에서는 0x10
, x64에서는 0x24
만큼의 차이가 일정하게 나타났습니다. 대신 이러한 최적화를 끌 수는 없었습니다.
https://stackoverflow.com/questions/43926610/how-are-stack-variables-aligned-on-64-32bit-machine#comment74887081_43926610
위 링크의 답변을 보시면, '컴파일러는 정렬이 미준수되었을 경우의 성능 저하를 우려하여 정렬을 준수할 것을 고수한다'라고 되어있네요.
네, cout
은 기본적으로 부동소수점 타입 값 출력 시, 소수점 아래 자리가 없다면 생략하고 정수 부분만 출력합니다. 대신 2.5 부동소수점수에서 보셨던, <iomanip>
헤더의 std::setprecision
을 사용하시면 이 경우에도 소수점 아래까지 출력이 가능합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 길민성님!
질문해 주신 두 가지 사항에 대해 설명 드리겠습니다.
x와 d의 주소가 같은가?
int
변수와 double
변수는 컴파일러에 따라 서로 다른 크기의 메모리 공간을 요구할 수 있으며, 이로 인해 예상한 주소와 실제 할당된 주소가 다를 수 있습니다.소수점 생략 여부
*ptr_d
를 출력할 때 C++의 cout
은 기본적으로 소수점을 생략하지 않지만, 123.0
은 123으로도 표현할 수 있습니다. 소수점 이하의 숫자가 정확히 0일 때 많은 출력 환경에서 소수점을 생략해 보여주는 경우도 있지만 이는 주로 출력 방식의 차이일 수 있습니다.cout
의 출력 설정을 변경하여 소수점을 강제적으로 출력하도록 설정할 수 있습니다.관련된 보다 상세한 예제를 이곳에서 확인할 수 있습니다: 함수선언 시 foo(ptr)은 되고 foo(*ptr)안되는 이유가 궁금합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.