배열에 관하여 알고리즘 공부를 하다가 띠용하는 일이 벌어져서 이 글에 조금 정리해둔다.

배열의 -1번째 index에 값이 할당이 되는 것처럼 보인다(?)

image
전에 작성한 글의 연습문제 2번에서 내가 처음 짠 코드이다(배열 값을 잘 보이게 출력하기 위해 조금 수정함)
arr[] = {0, 0, 0} 배열이라 할 때 코드를 실제로 돌려보면 위 스샷과 같이 에러없이 배열의 -1번째 index에 값이 3으로 제대로 할당이 되는 것을 알 수 있다.
게다가 freq[3]도 존재하지 않는 인덱스임에도 불구하고 0이 출력된다.
반면 arr[-1]과 arr[3]은 예상에 맞게 쓰레기값이 출력된다.

왜??? 그런지 여러가지로 검색해봤는데 전역변수와 지역변수가 할당받는 메모리가 다르다는 것 말고는 딱히 이유를 알 수 없었다.
지역변수는 stack에 할당되고, 전역변수는 data에 할당된다. 참고글
또한 전역변수는 초기화하지 않아도 전부 0으로 초기화된다는 점? 하지만 경계를 넘어선 값을 참조할 때도 그런지는 잘 모르겠다.
확실한 건 전역변수든 지역변수든 배열의 크기를 넘어서면 에러가 날 가능성이 있다는 점! 전역배열로 할당했을 때 바운더리 밖에서도 코드가 잘 돌아간다고 해서 그걸 보장할 수 있는 것은 아니다.

정리

전역변수는 data에, 지역변수는 stack에 할당된다.
전역변수는 초기화하지 않아도 0으로 초기화가 된다.

전역변수로 배열을 선언하면 바운더리 밖도 0으로 나올 수 있기 때문에 바운더리 밖의 값을 참조하는 오류를 잡아내지 못할 수 있다.
-> 가급적 지역변수로 선언하는게 낫겠다.