강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của sungjoo10131754
sungjoo10131754

câu hỏi đã được viết

C ngôn ngữ học theo cách làm của Hồng Jeong-mo

10.13 Mảng con trỏ và mảng hai chiều

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

Viết

·

424

0

안녕하세요!!

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

[그림 1]

[그림 2]

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

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

감사합니다.

c

Câu trả lời 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에 따라 무작위로 메모리 주소를 갖게 된다는 점이고 그에 반해 일반적인 배열선언을 해주면 연속적인 메모리주소를 갖게 된다는 걸 보여주고 싶은 예제가 아닌가 싶습니다. 그래서 결론적으론 무작위에 있는 배열을 찾아가게 되면 효율성이 떨어집니다. 위에있는 방식을 지양해라라는의미가 아닐까요

Hình ảnh hồ sơ của sungjoo10131754
sungjoo10131754

câu hỏi đã được viết

Đặt câu hỏi