2013-08-05 2 views
-3

저는 C 프로그래밍에 익숙하기 때문에 2D 정수 배열 (행렬)을 사용해야합니다. 예를 들면 다음과 같습니다.C에서 2D 배열 인덱스는 어떻게됩니까?

void main(){ 
    int matrix[2][2] = { {0,1}, {2,3} }; 
    printf("%i", matrix[4][4]); /*Here should be an index error, but that doesn't happen*/ 
} 

무엇이 잘못 되었나요?

+0

귀하의 질문은 2D 색인과 관련이 있습니까? –

+0

컴파일러는 정적 분석 도구를 대체하지는 않습니다 (일부 겹치기는하지만). Coverity의 Quality Advisor (상업용) 또는 부목 (오픈 소스)과 같은 보푸라기 도구를 원합니다. – jxh

답변

5

무엇이 잘못 되었나요?

컴파일러 및/또는 언어에 대한 가정은 잘못되었습니다. C에는 경계 검사가 없습니다. 경계 밖으로 배열에 액세스하는 경우 컴파일러에서 경고하지 않습니다.

대신 코드가 유효하지 않으며 정의되지 않은 동작 인을 호출하고 원하는 작업을 수행 할 수 있습니다 (충돌 또는 겉으로는 "정상적으로 작동 함"포함).

0

C는 배열 인덱스에 대한 경계 검사를 수행하지 않습니다. 이로 인해 off-by-one 오류 및 버퍼 오버 플로우가 발생할 수 있지만 코드 실행 속도가 빨라집니다. C 프로그래머는 유효한 색인 만 사용하도록해야합니다.

0

C에는 색인 오류가 없습니다. 인덱스 검사는 수행하지 않습니다. C에서 프로그래머는 전능하신 분이 모든 것을 알고 있기 때문에 컴파일하고 실행한다는 의미에서 당신이하는 모든 일은 '합법적'입니다. 당신이 할 때 matrix[4][4] 무슨 일이 일어나는지 정의되지 않은 동작입니다. 스택의 어딘가에서 인덱싱을하고 거기에있는 것을 잡아서 int로 해석합니다. matrix[300][200]과 같이 어리석은 배열에 접근하려고하면 세그먼테이션 오류가 발생할 가능성이 더 커집니다.

1

이이 특정 예를 제공합니다 C가 경계 검사를 수행하고 C99 draft standardJ.2 Undefined behavior 별관하지 않는 다른 언어와는 달리 undefined behavior 수 있습니다 :

- 배열의 첨자는 개체가 분명히 액세스 할 경우에도 범위를 벗어을 주어진 첨자 (int 값 a [4] [5]) (6.5.6)이 주어지면 왼쪽 값 표현 a [1] [7]과 같습니다.

관련 문제