작성
·
355
0
안녕하세요!!
복습을 하다가 질문이 생겨 문의드립니다.
[그림 1]
[그림 2]
1. 강의에 나온 코드와 똑같이 작성하였으나, Magic Carpet at 8223712에서 의문점이 생깁니다. Jasmine의 크기인 8이 추가되어 끝자리가 552가 될 것으로 예상했지만 왜 712가 나왔는지 모르겠습니다.
2. 또한 컴파일을 할 때마다 주소가 동일하게 나옵니다. 보통 포인터와 관련하여 컴파일을 할 때마다 주소값이 다르게 나오는데, 왜 이러한 형식에서는 고정값이 나오는지 잘 모르겠습니다.
감사합니다.
답변 2
3
안녕하세요.
이 부분은 12단원에서 메모리 레이아웃에 대해서 배우셔야 이해가 되실 내용입니다!
name 배열은 char* 포인터들이 모여있는 배열이죠. 4개의 포인터들은 "Aladdin", "Jasmine", "Magic Carpet", "Genie" 를 각각 가리킵니다. 이 문자열 리터럴들은 메모리의 Data 영역에 자리 잡습니다. 일반 배열이나 변수들은 메모리의 Stack 영역에 생성되는데 저런 문자열 리터럴들과 프로그램의 코드는 메모리의 Data영역이라는 곳에 자리 잡습니다. 이 영역에 어떤 방식으로 어떻게 저장할지는 운영체제가 결정합니다.
그래서 각 포인터들이 가리키는 "Aladdin", "Jasmine", "Magic Carpet", "Genie" 리터럴들은 가까이 붙어있는 편이긴 하지만 따로 따로 있을 수도 있어요. 배열은 원소들이 연속적으로 따닥따닥 붙어있지만 주의하셔야 할게 위 식에서 배열의 원소가 되는것은 문자열 리터럴들이 아닌 이 문자열 리터럴들을 가리키는 char * 포인터들이 배열의 원소인 것입니다...!! 문자열 리터럴들은 Data 영역 내에서 운영체제 관리하에 뭐 붙어있을 수도 있고,, 따로 있을 수도 있고,, 독립적이에요! 배열이 아니니까 서로 관련도 없습니다. 각 포인터들이 각각의 독립적인 리터럴들을 가리키는 것 뿐입니다. 따라서 8 차이가 나오지 않을 수도 있는 것입니다.
위와 같은 이유로 메모리 Stack 영역에서 관리되는 char[][15] aname 배열은 컴파일 할 때마다 주소가 달라졌던 것에 반해, char * 포인터들이 모인 name배열은 메모리 Data 영역에 있는 문자열 리터럴들을 가리키는 것이기 때문에 컴파일 해도 주소가 고정이였던 것입니다.
설명 드려보긴 했지만 이 부분은 12단원 공부 하셔야 이해하실 수 있을 것 같아요 😃
0
뒤의 강의를 듣지 않은 상태에서 제가 생각해봤을 땐 마지막에 설명이 좀 부족한 점이 있지만 일단 name은 포인터이고 aname 은 그냥 배열선언입니다. 그리고 결과값으로 유추해봤을 때 귀찮아서 포인터로 내용이 있는 배열선언을 해버려서 최적화를 한다면 그 안에 있는 원소들은 OS에 따라 무작위로 메모리 주소를 갖게 된다는 점이고 그에 반해 일반적인 배열선언을 해주면 연속적인 메모리주소를 갖게 된다는 걸 보여주고 싶은 예제가 아닌가 싶습니다. 그래서 결론적으론 무작위에 있는 배열을 찾아가게 되면 효율성이 떨어집니다. 위에있는 방식을 지양해라라는의미가 아닐까요