PL/C++ (2) 썸네일형 리스트형 [C/C++] 다차원 배열에서 인덱스 침범에 대한 고찰 개요 배열은 메모리 상에서 연속된 형태로 배치된다. 그렇기 때문에 배열은 랜덤 액세스가 가능하다(단순한 포인터 계산을 통해). 연속으로 배치되는 것은 1차원 배열 뿐만 아니라 2차원, 3차원 등의 다차원 배열도 해당된다. 그렇다면 이쯤에서 우리는 한 가지 의문이 생긴다. 다음의 코드를 보자. int arr[3][3]; arr[1][2] = 1; // OK arr[0][5] = 1; // ? 의미적으로는 arr[1][2]과 arr[0][5]가 동일한 원소를 가리켜야 할 것 같다. 하지만 실제로도 그럴까? 어서오세요, UB의 세계에! 결론부터 말하자면 UB이다. C11의 J.2절 Undefined behavior를 보면 다음과 같은 얘기가 있다. An array subscript is out of range.. [C++20] #define sz(x) (int)x.size()는 이제 그만 개요 #define sz(x) (int)x.size() C++로 PS를 좀 해본 사람이라면 누구나 공감할 만한 매크로일 것이다. 생소한 사람들을 위해 사용 예시를 들어 보자면, 다음과 같다. std::vector vec; // do something for (int i = 0; i < sz(vec); ++i) { // ... } 대충 벡터 등의 컨테이너 크기를 구하는 데 쓸 수 있다. 하지만 이렇게 쓸 거라면 그냥 vec.size()로 쓰지 않고 왜 굳이 (int)로 번거롭게 형변환을 하는 것일까? 형변환 하는 이유 그 이유는 size() 메서드가 std::size_t 타입을 반환하기 때문이다. std::size_t는 unsigned integer이므로 자칫하면 의도치 않은 상황을 유발할 수 있다. 다음.. 이전 1 다음