프로그래밍 언어/C, C++

[C/C++] 배열 인덱스에 음수(마이너스) 값 넣기

호무비 2024. 6. 9. 22:00
반응형

오늘은 C/C++에서 배열 인덱스에 음수 값을 넣게 되면 어떻게 동작하는지 한번 알아보도록 하겠습니다.

 

궁금해서 직접 실험해 보았는데, 재밌는 내용이 있어서 지금부터 소개해 보고자 합니다.


타 언어에서의 배열 인덱스 음수값 해석

 

배열 인덱스에 마이너스 값을 넣는 것은 일반적으로 두 가지 중 하나로 해석됩니다.

 

1) 허용하지 않음

 

자바, 고(Go) 같은 언어가 대표적입니다. 컴파일 단계에서 에러가 발생합니다.

 

Java 음수 인덱스 테스트

 

2) 배열의 마지막 요소부터 접근

 

파이썬, 루비가 대표적입니다. -1부터 숫자가 하나씩 작아질수록 배열의 마지막 요소에서 거꾸로 접근합니다.

 

Python 음수 인덱스 테스트

 

반응형

C/C++ 배열 음수 인덱스 실험

 

그렇다면 C/C++에서 배열에 음수 인덱스를 사용하면 어떻게 동작할까요? 궁금해서 직접 실험해 보았습니다.

 

C/C++ 음수 인덱스 테스트 (1)

 

개인적으로 허용하지 않을 것으로 생각했는데, 놀랍게도 동작하는 것을 확인할 수 있습니다. 물론 기대했던 배열의 마지막부터 접근하는 기능은 아니었고, 쓰레기 값(garbage value)을 리턴하고 있었습니다.

 

앞선 두 가지 케이스와는 모두 일치하지 않는 결과인데, 어떤 원리에 의해서 이렇게 동작하는 것일까요? C언어의 인덱스 연산자(operator [])와 그 동작 프로세스를 알아야, 이 음수 인덱스를 이해할 수 있습니다.

 

배열 a가 있고, a[i]와 같이 사용하게 되면, 이는 *(a+i)로 변환됩니다. 배열의 변수 이름은 그 배열 첫 요소를 가리키는 포인터이기도 하므로 a에서 i만큼 떨어진 곳의 값, 즉 i번째 요소를 가져오게 되는 것입니다.

 

포인터 연산으로 변환된다는 것을 생각하면, 앞으로 갈 수도 있고 뒤로 갈 수도 있으므로 음수 인덱스를 사용하는 것도 논리상 전혀 문제가 되지 않습니다. 물론 위의 경우, 유효하지 않은 메모리 주소를 참조하므로 무언가 값이 있지만 정상적인 동작은 아니고, -10000000 같이 사용 불가능한 위치를 가리키게 된다면 아예 동작하지 않을 수도 있다는 점을 유의해야 할 것 같습니다.

 

실제로 *(a+i) 연산에서 i가 음수일 때에도 동일하게 동작하는지도 한번 살펴보겠습니다.

 

앞선 결과와 마찬가지로 컴파일 오류를 발생시키지는 않지만, 비정상적인 값을 리턴한다는 점은 동일한 것을 확인할 수 있습니다.

 

C/C++ 음수 인덱스 테스트 (2)


번외편: 실사용례

 

해당 동작을 어떻게 활용할 수 있을지 이것저것 찾아보고 고민해 보았는데, 좌표계를 배열로 나타낼 때 도움이 될 수 있을 것 같습니다.

 

배열의 가운데 위치를 가지는 포인터를 하나 가지고 있으면, 배열을 절반으로 나누어 음수 좌표를 인덱스로 접근하여 사용할 수 있습니다.

 

int temp[2*n];
int* a = &temp[n];

 

위 코드를 활용하면 a는 -n부터 n-1까지 접근 가능한 배열로 사용할 수 있습니다. 음수 좌표를 조금 더 직관적으로 표현할 수 있는 방법이 아닌가 생각합니다.

 

C/C++ 음수 인덱스 활용

 

실제 테스트해 보았는데, 음수 인덱스를 사용하더라도 원하는 값이 잘 출력되는 것을 확인할 수 있습니다.

 

다만, 헷갈리기 쉽고 혼동의 여지가 있다는 점에서, 개인적으로 썩 바람직한 코드는 아닌 것 같다는 생각이 듭니다. (아마 PS에서 테크닉적으로 사용하는 경우가 종종 있는 것 같습니다.)

 

참고: https://stackoverflow.com/questions/3473675/are-negative-array-indexes-allowed-in-c


오늘도 재미있는 실험이었던 것 같습니다. 다음에 또 궁금한 내용이 있으면 테스트해 보겠습니다.

 

직접 조사해서 작성하는 글이다 보니 일부 정확하지 않은 정보가 포함되어 있을 수 있습니다.

궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~

구독과 좋아요, 환영합니다!

 

 
반응형