• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

마지막 예제에서 질문있습니다.

21.02.03 22:47 작성 조회수 247

0

안녕하세요!!

복습을 하다가 질문이 생겨 문의드립니다.

[그림 1]

[그림 2]

1. 강의에 나온 코드와 똑같이 작성하였으나, Magic Carpet at 8223712에서 의문점이 생깁니다. Jasmine의 크기인 8이 추가되어 끝자리가 552가 될 것으로 예상했지만 왜 712가 나왔는지 모르겠습니다.

2. 또한 컴파일을 할 때마다 주소가 동일하게 나옵니다. 보통 포인터와 관련하여 컴파일을 할 때마다 주소값이 다르게 나오는데, 왜 이러한 형식에서는 고정값이 나오는지 잘 모르겠습니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

3

안소님의 프로필

안소

2021.02.03

안녕하세요.

이 부분은 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

Ad Astra님의 프로필

Ad Astra

2021.08.10

뒤의 강의를 듣지 않은 상태에서 제가 생각해봤을 땐 마지막에 설명이 좀 부족한 점이 있지만 일단 name은 포인터이고 aname 은 그냥 배열선언입니다. 그리고 결과값으로 유추해봤을 때  귀찮아서 포인터로 내용이 있는 배열선언을 해버려서 최적화를 한다면 그 안에 있는 원소들은 OS에 따라 무작위로 메모리 주소를 갖게 된다는 점이고 그에 반해 일반적인 배열선언을 해주면 연속적인 메모리주소를 갖게 된다는 걸 보여주고 싶은 예제가 아닌가 싶습니다. 그래서 결론적으론 무작위에 있는 배열을 찾아가게 되면 효율성이 떨어집니다. 위에있는 방식을 지양해라라는의미가 아닐까요