Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 배열의 범위를 벗어난 인덱스(Index Out of Bounds)란?

배열의 범위를 벗어난 인덱스란?

네 개의 요소를 가진 배열이 있다고 가정해 보겠습니다. C 언어에서 배열 인덱스는 0부터 시작하기 때문에, 이 배열의 유효한 인덱스 범위는 0부터 3까지입니다. 즉, 인덱스 0~3에 해당하는 요소에만 접근할 수 있습니다.

그런데 만약 3보다 큰 인덱스(예: 4, 5 등)를 사용하게 되면, 이를 범위를 벗어난 인덱스(index out of bounds)라고 부릅니다.

흥미로운 점은, 범위를 벗어난 배열 인덱스를 사용하더라도 C 컴파일러는 별도의 경계 검사를 수행하지 않기 때문에 프로그램이 정상적으로 컴파일되고 실행된다는 것입니다. 하지만 올바른 결과가 나온다는 보장은 전혀 없습니다.

결과는 예측할 수 없으며, 메모리 손상이나 비정상 종료 같은 심각한 문제로 이어질 수 있습니다. 따라서 배열 인덱싱을 사용할 때는 항상 유효한 범위 내에 있는지 주의 깊게 확인해야 합니다.

예제 프로그램

다음은 배열에서 범위를 벗어난 인덱스를 보여주는 C 프로그램입니다.

#include<stdio.h>
int main(void){
    int std[4];
    int i;
    std[0] = 100; //유효함
    std[1] = 200; //유효함
    std[2] = 300; //유효함
    std[3] = 400; //유효함
    std[4] = 500; //유효하지 않음(범위를 벗어난 인덱스)
    //모든 요소 출력
    for( i=0; i<5; i++ )
        printf("std[%d]: %d\n",i,std[i]);
    return 0;
}

출력 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

std[0]: 100
std[1]: 200
std[2]: 300
std[3]: 400
std[4]: 2314

결과 분석

이 프로그램에서 배열의 크기는 4이므로, 유효한 배열 인덱스는 std[0]부터 std[3]까지입니다. 하지만 코드에서는 std[4]에 값 500을 할당했습니다. 이것이 바로 범위를 벗어난 접근입니다.

그럼에도 불구하고 프로그램은 오류 없이 컴파일되고 실행됩니다. 문제는 값을 출력할 때 발생합니다. std[4]에는 500을 할당했지만 실제로 출력된 값은 2314라는 엉뚱한 숫자입니다. 이는 허용되지 않은 메모리 영역을 덮어쓰거나 읽으면서 발생하는 쓰레기값(garbage value)으로, 프로그램의 동작이 더 이상 예측 불가능해졌음을 의미합니다.

이처럼 C 언어는 배열의 경계를 자동으로 검사하지 않으므로, 개발자가 반드시 인덱스 범위를 스스로 관리해야 합니다. 반복문의 조건식을 작성할 때 특히 주의하고, 배열 크기를 상수로 정의해 활용하는 것이 안전한 코딩 습관입니다.