C++ 배열 초기화 질문입니다.

minkyuramer의 이미지

이해가 안가 질문 올립니다.

int a[2] = {2,3};

a[4] = 0;
위와 같이 코딩하면 디버깅 에러 나야 정상아닌가요 ?

이미지 파일 보시면 에러가 안뜨고 잘되는데

Visual studio 2008 버그인건지 제가 모르는 무언가가 있는건지 궁급합니다.

File attachments: 
첨부파일 크기
Image icon 배열.PNG19.13 KB
antaran의 이미지

c언어는 배열 index에 대한 유효성(?) 체크를 하지 않습니다. a[4] = 0 는 그저 *(a + 4) = 0 이고 문법적으로 아무 문제가 없습니다.
그런데 워닝도 없나요? 최근 컴파일러들은 워닝은 해주는 것도 같던데요. 2008 이라서 그런지도 모르겠습니다.

차고로 제 맥에서 컴파일 한 결과는 아래와 같습니다.
tt.cpp:13:1: warning: array index 4 is past the end of the array (which contains
2 elements) [-Warray-bounds]
t[4] = 0;
^ ~
tt.cpp:11:1: note: array 't' declared here
int t[2] = {2, 3};
^
1 warning generated.

minkyuramer의 이미지

감사합니다 . 안타깝게 경고조차 없네여

jehnpark의 이미지

경고수준 올리면 다 뜹니다

twinwings의 이미지

C 프로그래머의 자유도를 위해 허용은 합니다.

typedef struct BigArray {
 int front[1024];
 int back[0];
};
 
BigArray *ba = malloc(sizeof(BigArray));
 
ba->back[-1];

이런 해괴망칙한(struct hack이라 불리는) 코딩을 위해 배열의 경계체크를 하지 않습니다.

koreaphb의 이미지

런타임에 오류에 해당하므로, 문법상의 잘못된 부분은 없기 때문에 컴파일 시 오류로 구분하지 않는게 기본이죠.