2016-09-05 11 views
1

각 좌표에 임의로 1 또는 0이 할당 된 2 차원 배열을 만들려고합니다. 그것은 좌표에 도달 할 때까지 잘 작동합니다 [20] [3]. 그 다음에 "segmentation fault 11"이 나옵니다.루프에서 배열 요소에 액세스하려고하면 세그먼트 화 오류가 발생합니다. 이유는 무엇입니까?

나는 어떻게 또는 왜 그렇게 단서가 없다. 특히 예를 들어 200 * 200의 행렬을 만들 수 있기 때문에 특히 그렇지만 [200] [3] 좌표에서만 동일한 문제가 발생합니다. 따라서 오류가 발생한 마지막 x 좌표의 세 번째 y 좌표입니다.

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    int x, y, i, j ; 
    x = 20; 
    y = 20; 

    int grid [x][y]; 

    for (i = 0; i <= x; i++) { 
    for (j = 0; j <= y; j++) { 

     grid[i][j] = rand() % 2 ; 

     printf("grid [%d][%d]: %d\n", i, j, grid[i][j]); 

    } 
    } 
    return 0; 
} 
+0

오류가 있습니다. 귀하의 색인은 19에만 도달 할 수 있습니다 : for (i = 0; i Alexi

+0

@Alexi 저게 뭐죠? –

답변

2

C는 배열에 대해 0부터 시작하는 색인을 사용합니다. 따라서, 어레이에 대한

for (i = 0; i <= x; i++) 
    for (j = 0; j <= y; j++) 

경우 off-by-one 대해 반복

int grid [x][y] 

정의. (<= 부분은입니다.

상세한 설명을 위해, p의 배열에 대해 유효한 인덱스는 0에서 p-1까지입니다.

범위를 유지하려면 루프 상태를 i < xj < y으로 변경해야합니다. 초과 메모리에 액세스하면 undefined behavior이 발생합니다. 말했다

,

  • int main()int main(void)해야 적어도, 호스팅 환경을위한 C 표준을 준수 할 수 있습니다.
  • 여기서 VLA로 grid을 만들 필요가 없습니다. 치수가 이미 알려졌다면, 더 나은 접근법은 컴파일 시간 상수 (#define)를 사용하여 배열 치수를 생성하는 것입니다.
2

당신은 경계 배열의 과거 실행 중입니다. 그것은 의 정의되지 않은 동작이며, 그 자체가 충돌로 나타납니다.

i <= x에서 i < x 등으로 변경하거나 눈금 크기를 늘리십시오.

관련 문제