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 |
---|