작성
·
241
0
밑에 Han Jo 님과 같은 현상인거 같은데
31번째 줄
printf("%-30s %-30s\n", "My Things:", "Your Things:");
이 명령문이 있고 없고 const char* mythings[5] 배열이 들어가 있는 값이 차이가 있네요
값이
31번째 줄을 주석처리를 하면 const char* mythings[5] 의 주소배열이
이런식으로 들어가 있고
31번째 줄을 주석 처리를 안하면 const char* mythings[5] 의 주소배열의 값이
이런식으로 %c 와 %d가 중간중간 '\0'값과 바뀌어 들어가네요
단순한 오류라고 봐도 괜찮을까요? 아니면 제가 이해를 못한부분이 있는걸까요?
답변 2
4
안녕하세요! 질문자님과 비슷한 현상이 나오는 것을 제 컴퓨터에서도 확인했습니다.
이 const char* mythings[5] 의 원소(포인터)들이 가리키는 원본 문자열 리터럴들은 TEXT Segment 메모리 영역에 저장되어있습니다. 이 영역은 개발자가 절대 수정할 수 없는 영역이며 프로그램 코드들이 저장되는 영역이기도 해서 위와같이 프로그램의 일부 코드들도 문자열 리터럴들과 같은 영역에 섞여서 저장되어 있는 것을 확인할 수 있습니다.
오류라기보단 운영체제가 원본 문자열 리터럴들과 프로그램 코드들을 어떻게 TEXT Segment 메모리 영역에 저장하느냐에 따른 문제라고 보여집니다.
경우에 따라 위와같이 문자열 리터럴들이 저장된 곳 사이 사이에 운영체제가 프로그램 코드 일부(예를 들어 printf 호출 문장의 일부인 %c, %d 같은)를 저장해주기도 하나보다라고만 이해해주시면 될 것 같습니다. 운영체제가 알아서 저장하고 정리 해주는 방식일뿐입니다! Text Segment는 프로그램 코드들이 저장되다보니 전적으로 운영체제가 관리하는 메모리 영역이라고 생각하시면 됩니다.
yourthings배열과 달리 mythings는 포인터들이 각각 TEXT Segment 메모리 영역에 저장되어있는 문자열 리터럴 원본들을 가리키는 방식이기 때문에 문자열 리터럴들은 떨어져 있기도 하고 위와 같이 사이사이에 다른게 저장될 수도 있는 것 같아요. 꼭 연속적으로 저장되진 않는 것 같습니다. 문자열 리터럴들은 배열에 종속된 그런 것이 아니라 독립적이니까요! mythings배열의 포인터 원소들이 독립적으로 Text Segment 영역에 배치된 각각의 이 문자열 리터럴들을 가리킬 뿐이구요.
강의 후반부에서 교수님께서 포인터를 통해 배열의 범위를 벗어난곳까지 100개 이런식으로 출력하는 것은 가능은하나 권장하지 않는 방법이라고 말씀을 하셨는데 이런 케이스와 관련이 있을 수 있겠네요! 경우에 따라 이렇게 TEXT Segment 내에서 문자열 리터럴들 사이사이 간에 다른 코드의 일부가 저장될 수도 있으니 문자열 리터럴을 벗어난 공간으로부터 원하지 않는 %c %d 이런 것들이 출력될 수도 있으니까요.
0