안 쓰던 블로그

배열 마이너스 주소에 관하여 본문

알고리즘/Algorithm

배열 마이너스 주소에 관하여

proqk 2016. 5. 22. 18:17
반응형

이 글(http://foxtrotin.tistory.com/40)에서 배열의 마이너스 주소에 대해 질문을 받았습니다.

요지는 lake[-1][-1]이 왜 에러가 나지 않는가..에 관한 내용입니다.


배열이란 같은 데이터형을 가진 여러개의 데이터가 메모리 안에 쭉 나열되어 있는 것을 뜻합니다. 

배열의 요소가 되는 각각의 데이터는 인덱스라는 일렬번호를 부여받는데, 

컴파일 할 때 이 인덱스와 실제 메모리 어드레스간의 변환 작업을 거쳐 인덱스에 대응하는 메모리 영역을 쓸 수 있는 것입니다.

이러한 이유로 lake[-1][-1]을 호출하면 우리는 모르지만 거기에 해당되는 메모리 영역을 가져오게 되기 때문에 에러가 나지 않습니다.



코드로 살펴보겠습니다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
    int a[10][10];
    int w, h;
    scanf("%d %d\n", &w, &h);
 
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    a[-1][-1= 2;
 
    printf("2로 초기화 후 출력:%d 16진수:%x\n", a[-1][-1], &(a[-1][-1]));
    printf("초기화 하지 않음:%d 16진수:%x\n", a[-2][-2], &(a[-2][-2]));
    printf("입력 받은 값의 1,1부분을 출력:%d 16진수:%x\n", a[1][1], &(a[1][1]));
}
cs

출력


a[-1][-1]이든, a[1][1]이든 메모리 영역을 가지고 있고,

마이너스 영역 역시 초기화를 해주면 사용할 수 있다는 것을 알 수 있습니다.




반응형
Comments