2017-09-10 1 views
-2

int arr[2]={10,20,30,40,50}가 왜 오류가 발생합니까? Array Bound Checking으로 왜이 초기화 이스케이프 오류가 발생하지 않습니까?아래의 배열 초기화 방법은 컨텍스트에서 배열 경계 검사와 어떻게 다릅니 까?

int arr[2] ; 
arr[0]=10, arr[1]=20, arr[3]=30, arr[4]=40; 

배열 바운드 검사를 통해 C 언어의 컨텍스트에 오류가 발생하지 않습니까?

+0

키워드는 "정의되지 않은 동작"입니다. 다시 읽지 않거나 더 좋은 책을 얻지 못한다면 C 책에서이 책을 읽어야합니다. 자세한 내용은 기초 연구의 일부에 이미 이에 관한 많은 게시물이 있습니다. – Olaf

+0

@ T.Akki 당신과 컴파일러간에 계약을 남용하는 이유는 무엇입니까? 당신은 나중에 두 번째 요소가 30rth를 할당한다고 말합니다. 무엇 때문에? 귀하의 프로그램에서 그것을 피하는 방법을 더 잘 생각하십시오. –

+0

컴파일러는 컴파일 할 수없는 것을 알려주고 실행이 불가능한 것이 아니라 다양한 도움을줍니다. –

답변

1

C에서 런타임 배열 범위 검사가 없습니다. 메모리에있는 내용을 자유롭게 지울 수 있습니다. 첫 번째 예제는 컴파일 타임 구조이므로 컴파일러는 크기가 2 인 배열을 선언했으며 초기화에> 2 개 요소가 있음을 알았습니다.

+0

"기억이 나는 것은 무엇이든 지울 수 있습니다."- 1) 아니오! 2) 그것은 정의되지 않은 행동이며, 모든 배팅은 꺼져 있습니다. 실제로 무슨 일이 일어나는지. 하드 드라이브를 포맷해야합니다. – Olaf