C언어에서 조심해야 할 것이 한둘이 아닙니다만, 저 같은 경우 함수 내에서는 가급적 배열을 사용하지 않으려고 노력합니다. 만일 배열을 사용해야 한다면 반드시 static 으로 설정하죠. 뭘 이렇겠까지 하시겠습니다만, C 컴파일러가 어떻게 작동하는지 정확히 모르기 때문입니다. 함수 내부에 static 키워드 없이 변수를 선언하면 그 변수는 스택 영역을 이용합니다. 그래서 함수에서 복귀하면 스택 포인터의 값이 복구되기 때문에 자연스럽게 변수는 제거되는 것이죠.

 

그렇다면 고정 크기가 아닌 배열의 경우 어디에 생성될까요? 스택? 힙? 아직까지 어디에 생성되는지 정확히 모릅니다. 다른 파워 프로그래머에게 확인해 보면 스택의 크기에 따라 여유가 있으면 스택에, 아니면 힙에 생성한다는 분이 있고, 또 어떤 분은 일정 크기 이내는 스택, 그 이상은 힙 영역에 생성된다는 분도 있습니다.

 

차라리 모두 힙에 생성되면 좋을 것 같은데, 그렇게 되면 C 컴파일러는 배열 변수를 관리해 주어야 하는 부담이 생깁니다. 함수 실행할 때 배열 변수를 만들고 함수를 종료할 때 반환해야 하니까 말이죠.

 

자, 스택이든 힙이든 함수 내부에 선언한 변수는 안전할까요? 1K 버퍼를 만들 때 malloc( 1024)를 사용하면, 그리고 메모리를 확보하지 않았을 때에는 NULL을 반환하기 때문에 메모리 생성 여부를 알 수 있습니다.

  char *ptr;
  
  ptr = malloc( 1024);
  if ( NULL == ptr){
        // 메모리 부족으로 처리를 못함.
  }

그러나 배열은 아니죠.

  char array[1024];

  if ( NULL == array){    <--- 이런 코드는 말도 안 됩니다. 
        // 메모리 부족으로 처리를 못함.
  }

 

위의 if ( NULL == array) 가 말이 안 되는 것은 포인터와 배열의 구조가 다르기 때문입니다. ptr처럼 array 변수에 공간이 없기 때문이죠. array[0], array[1], array[2], .... array[1023] 이 있을 뿐입니다.

 

그렇다면 문제는? 메모리 공간이 많지 않을 경우 함수를 호출하고 함수가 배열을 선언하고 있으면? 그 지긋지긋한 Segmentation 에러가 발생하게 되지요.

 

static 키워드를 사용하면 뭐가 달라지나요? 네, static을 사용하면 프로그램 실행할 때 생성되므로 메모리가 없으면 실행하자마자 오류가 발생하고 종료하게 됩니다. 만일 실행된다면 함수 내부의 배열 때문에 오류가 발생하지 않습니다.