배열 초과
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언어의 속도가 빠른 이유도 있다.
'C,C++' 카테고리의 다른 글
[C++] 상수와 포인터 (0) | 2023.01.24 |
---|---|
C언어 string.h 문자열 관련 함수 정리 (0) | 2021.01.09 |
C언어 표준함수 확인 (0) | 2021.01.09 |
함수 내부에 크기가 너무 큰 배열 선언 시 메모리 초과 (0) | 2020.08.20 |