본문 바로가기
Study/C언어

C언어 - 2차원 배열과 메모리 크기

by 멘탈은안녕하신가 2018. 12. 20.
728x90
반응형
  • 2차원 이상의 배열에서 우리가 간과하는것이 있다.
    • 배열의 모양이 우리가 상상하는 3D 상자모양처럼 될 것이라는 생각이다.
    • 2차원 이상의 배열은 1차원 배열과 동일하게 일직선 선형으로 보관된다.
  • [3][3] 2차원 배열의 경우

- 예상

[0][0] [0][1] [0][2]

[1][0] [1][1] [1][2]

[2][0] [2][1] [2][2]

 

- 실제

[0][0]

[0][1]

[0][2]

[1][0]

[1][1]

[1][2]

[2][0]

[2][1]

[2][2]

 

  • 위와 같은 그림으로 메모리상에 일직선으로 나타난다.
    • [3][2]의 2차원 배열 예제를 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main(void )
{
 
    int i, j;
    int num[3][2= { 123456 };
 
    printf"num[0][0] = %d, &num[0][0] = %d\n" , num[0][0],&num[0][0]);
    printf"num[0][1] = %d, &num[0][1] = %d\n" , num[0][1],&num[0][1]);
    printf"num[0][2] = %d, &num[0][2] = %d\n" , num[0][2],&num[0][2]); // 잘못된 값
    printf"num[1][0] = %d, &num[1][0] = %d\n" , num[1][0],&num[1][0]);
    printf"num[1][1] = %d, &num[1][1] = %d\n" , num[1][1],&num[1][1]);
    printf"num[1][2] = %d, &num[1][2] = %d\n" , num[1][2],&num[1][2]); // 잘못된 값
    printf"num[2][0] = %d, &num[2][0] = %d\n" , num[2][0],&num[2][0]);
    printf"num[2][1] = %d, &num[2][1] = %d\n" , num[2][1],&num[2][1]);
    printf"num[2][2] = %d, &num[2][2] = %d\n" , num[2][2],&num[2][2]); // 잘못된 값
 
}
 
cs

 

  • 결과

  • 배열이 익숙치 않은 사람들은 위와같은 실수를 자주 범한다.
    • [3][2]이기 때문에 x의 인덱스는 2까지, y의 인덱스는 1까지만 와야한다.
    • ([0][2]와 [1][2], 그리고 [2][2]는 빠져야 한다.)
  • 여기서 이상한점을 발견, 바로 [0][2]와 [1][0], 그리고 [1][2]와 [2][0]의 결과값과 주소가 똑같은것.
  • x와 y의 인덱스를 넘어섰기 때문에 오류가 날 것으로 예상했지만, 그렇지 않았다.
  • 이것은 위에서 말한것처럼 C에서의 2차원 배열이 1차원배열처럼 일직선으로 나타나는것과 관련이 있다.

  • 위 그림을 보면, num[0][2] = 3은 기본값 num[0][0] = 1에서 +2가 된 값이다.
  • 아래와 같이 실제 메모리처럼 일직선으로 나타나면 num[1][0] = 3 또는 기본값 num[0][0] = 1 에서 +2가 된 형태이다.

 

  • 우리가 상상하는 첫번째 그림은 실제로 존재하지 않는 값인 num[0][2]가 기본값에서 +2가 된 num[1][0]과 같은 메모리 값을 갖기 때문에 결과값과 주소가 같은 값이 나오는 것이다.
728x90
반응형

댓글