Re: 38.4 예제
, 도장_ 관리자님이 작성직관으로 이해하지 말고 C 언어에서 2차원 배열을 동적으로 할당하는 방식을 그림으로 그려서 이해하는 게 좋습니다.
UNIT 38.3의 그림 38-3을 보세요.
UNIT 38.4의 예제를 보세요.
직관적으로 이해할 때는 행과 열이라고 이해하죠. 보통 행 = 가로, 열 = 세로라고 생각하게 됩니다.
그런데 3행(row)짜리면 세로로 3개가 필요하죠? 그림에서 m[0], m[1], m[2]입니다. 그래서 세로 크기를 할당해야 합니다. row 개수로는 세로 크기를 할당합니다.
4열(col)짜리면 가로로 4개가 필요하죠? 그림에서 m[0][0] ~ m[0][3]까지에 해당합니다. 그러니 여기서는 col 개수만큼 가로 크기를 할당합니다.
배열이 정사각형일 때는 가로, 세로를 혼동해도 버그는 있을지언정 동작은 제대로 합니다. 그러나 배열이 직사각형일 때는 범위를 벗어난 접근을 하게 되어 문제가 발생합니다.
다시 말해 100x100 배열일 때는 문제가 없지만, 100x200 배열이면 문제가 발생하게 됩니다. 가로, 세로를 바꾸면 직사각형일 때는 배열을 참조하는 인덱스 값이 크게 잘못 계산되기 때문에 반드시 문제가 발생합니다.
UNIT 81 심사 문제에 대한 이전 답변에 가로, 세로가 바뀔 때의 메모리 접근 위치가 바뀌는 부분을 설명했습니다.
직관으로
이해하지 말고, 그림으로 그려서 이해하세요. 그림 38-3을 눈 감고 그릴 수 있어야 하고, 그걸 코드로 바로 작성할 수 있어야
합니다. 해당 그림에서 블록이 떨어져 있는 이유는 메모리에서 연속되어 있지 않기 때문입니다. 블록이 붙어 있는 경우는 연속되어
있기 때문입니다.
10x15짜리
2차원 배열(또는 행렬)이면 먼저 10층을 올려야 하고, 각 층에 15칸을 만들어야 합니다. 10은 세로 열을 선택하고, 15는
가로 열을 선택하죠. m x n이면 m은 세로 열, n은 가로 열을 선택하는 겁니다. 이걸 직관적으로 가로 x 세로로 이해하려고
하면 안 됩니다. 프로그래밍 언어에서 메모리는 그렇게 할당되지 않습니다.
직관적으로 이해하지 말고 그림으로 이해하세요.
기본은 세로 층을 먼저 올리고, 각 층에 가로 칸을 만든다. 입니다.
포럼 상단에 "가로"로 검색하면 많은 분들이 질문한 내용이 있습니다.