배열 초과

push와 pop을 구현하던 중, 배열을 넘어서 값이 계속 들어가면 어떻게 될까라는 궁금증이 생겼음.

int stack[5];
int top = 0;

int main() 
{
    push(3);
    push(5);
    push(6);
    push(6);
    push(7);
    push(8);
    push(9);

    stack_print();
    printf("stack배열 인덱스 출력\n");
    for (int i = 0; i < 5; i++) {
        printf("%d\n", stack[i]);
    }

    system("pause");
    return 0;
}

void push(data) 
{
    stack[top] = data;
    top += 1;
}

int pop() 
{
    --top;
    int temp = stack[top];
    return temp;
}

void stack_print()
{
    for (int i = top - 1; i >= 0; i--) {
        printf("%d\n", stack[i]);
    }
}

결과값

9
8
7
6
6
5
3
stack배열 인덱스 출력
3
5
6
6
7

로 출력이 되었음. 에러가 날 줄 알았는데 아니어서 당황함 ㄷㄷ...

 

이유

: C컴파일러는 배열의 범위를 벗어나는 곳에 값을 집어넣으려 하는 경우에 오류처리 하지 않는다.

 

예를 들어서

char str[8];

위와같이 선언된 배열이 있고, str[8]에 값을 넣으려고 하면 오류가 나지 않는다. str[8]은 단순히 주소를 표현하는 형식일뿐인데, 컴파일러는 해당 주소에 대한 유효성을 검사하지는 않기 때문이다.

 

내용 추가 및 정리 예정입니다.

// run-time -descriptor관련 내용

컴파일 단계에서는 값을 직접대입하는 건 허용되지 않는다. 컴파일러 내부에서 maxlength를 가지고 있기 때문에 검사는 가능하지만, 런타임 단계에서는 run-time-descriptor가 maxlength를 가지고 있지 않기 때문에 for문으로 값을 삽입하는 과정에서는 문제가 생기지 않는다. C가 런타임 환경일 때 maxlength를 가지지 않는 이유는 문자열의 끝을 NULL값으로 판단하는 등의 이유떄문이데, 사실 이런 런타임때 maxlength의 값을 수시로 비교하지 않기 떄문에 C언어의 속도가 빠른 이유도 있다.