Personal Study/잡다한 개발 지식

[C] 배열을 초과하여 데이터를 넣을 수 있을까?

vㅔ로 2022. 7. 26. 14:21
728x90

결론부터 말하자면 가능하다

 

#include <stdio.h>
#define MAX_SIZE 10

int stack[MAX_SIZE];
int top = -1;

int is_full() {
	if (top >= MAX_SIZE - 1) {
		return 1;
	}
	return 0;
}

int is_empty() {
	if(top == -1) {
		return 1;
	}
	return 0;
}

void push(data) {
	if(!is_full()) {
		stack[++top] = data;
	}
}

int pop() {
	if(!is_empty()) {
		return stack[top--];
	}
}

int main() {
	push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
    push(1);
}

범위를 넘어서 값을 삽입하면 어떻게 되는지 실험해보았다.

위 코드는 크기가 10인 stack에 11개의 값을 넣어본 것이다. 정상적으로 실행되어서 뭐지? 라는 생각이 들었다.

 

알고보니 C 컴파일러는 배열의 범위를 벗어나는 곳에 값을 넣으려고 하는 행동 자체를 에러 처리 하지 않는다고 한다.

정확하게는 포인터 연산을 이용해서 계산하는 중 배열의 크기를 넘어서는 접근을 할 때, 컴파일러는 어떤 오류도 발생시키지 않는다. 

생각해보면 그냥 주소값에 값 넣는 거라 행동 자체는 문제 없긴 하다...ㅋㅋㅋ

 

대신 주의해야 하는 것은 범위를 넘은 인덱스 값에 접근하려고 할 때이다.

 

int a[5] = {1, 2, 3, 4, 5};
a[6] = 10;
printf("%d", a[6]);

gcc로 실행했을 때 에러 없이 실행되었다. 그러나 a[6]에 저장된 값이 어떤 역할을 하는 값일지 모르지만 10으로 덮어쓴 것이 된다. 

배열 범위를 넘어 값을 저장하면 중요한 변수의 값을 덮어 씌우는 결과를 가져올 수 있으니 주의해야 한다.

728x90

'Personal Study > 잡다한 개발 지식' 카테고리의 다른 글

[Docker] Dockerfile 설정  (0) 2022.12.27