배열 변수를 선언할 때 +1을 꼭 넣는 습관이 있습니다. 코드가 작성된 모습을 보아도 제가 만든 것인지, 아니면 다른 사람의 프로그램인지 구별할 수 있지만, char buff[BUFF_MAX_SIZE+1]처럼 배열 크기를 지정하는 부분에 +1이 들어 있으면 거의 제가 작성한 프로그램인 경우가 많습니다. 아니면, 제 생각에 동의하는 동료의 소스이거나 말이죠.


배열을 선언할 때 +1을 하는 습관은 C언어의 배열 특성 때문입니다. C언어에서 배열 선언은 배열의 크기를 지정하는 것이지 배열 요소 번호의 마직막 번호를 의미하는 것은 아닙니다.

즉,


    char   buff[100];


이라고 선언하면 100개의 char 배열이고 요소의 인덱스 시작은 항상 0 이므로,


    buff[0], buff[1], ........ buff[99]


가 됩니다. char   buff[100]; 로 선언해도 buff[100]은 없죠. 아마도 C언어를 하시는 분은 대부분 아시는 내용일 것입니다. 그리고 배열 크기는 프로그램 소스 내에서 영향을 미치므로 보통 상수를 사용합니다.


   #define BUFF_MAX_SIZE        100


   char buff[BUFF_MAX_SIZE];


이처럼 말이죠. 문제는 가끔 실수를 합니다. 아래처럼 말이죠.


    buff[BUFF_MAX_SIZE]   = '\0'


C언어에서 이런 오류는 찾아 내기 참 어렵습니다. 컴파일 에러나 실행 에러 없이 잘 실행되다가 어느 때 갑자기 프로그램이 이상해 집니다. 바로 위의 코드로 다른 변수의 값이 변형되기 때문이죠. 이상하게 다른 문자열인 데, 두 번째 문자열 변수를 출력하면 제대로인데 첫 번째 문자열 변수를 출력하면 첫 번째와 두 번째 문자열이 함께 출력되거나 숫자 계산이 정확하다가도 엉뚱하게 변하게도 합니다. 미치죠.


지금은 컴파일러가 좋아서 경고를 내어 주겠지만, 함수에 포인터를 넘겨 주고 위의 코드처럼 처리하면 아무리 컴파일러가 똑똑해도 문제점을 찾기는 매우 어렵습니다. buff 변수만 넘어 오는 것이 아니기 때문이죠.


그래서 배열 크기를 하나 더 잡으면 위와 같은 버그를 미리 막을 수 있습니다. 물론 더 중요한 것은 이런 버그 코드를 만들어서는 안 되겠죠. ^^