2017-04-24 11 views
-1

이 간단한 코드로 이상한 "Segmentation fault : 11"이 표시되어 문제를 파악할 수 없습니다. 동적으로 선언하고 크기 nrows x ncolumns 배열로합니다.세그먼트 오류가 발생하는 calloc이있는 단순한 2D 배열

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

int main() 
{ 
    int nrows = 3; 
    int ncolumns = 5; 

    int **array; 
    array = calloc(nrows, sizeof(int)); 
    for(int i = 0; i < nrows; i++) 
    { 
     array[i] = calloc(ncolumns, sizeof(int)); 
     if(array[i] == NULL) 
     { 
      fprintf(stderr, "out of memory\n"); 
      exit(-1); 
     } 
    } 

    for(int i = 0; i < nrows; i++) 
    { 
     for(int j = 0; j < ncolumns; j++) 
     { 
      array[i][j] = 10; 
      printf("%d %d: %d\n",i,j, array[i][j]); 
     } 
    } 
    return 0; 
} 
+4

'array = calloc (nrows, sizeof (int));'array = calloc (nrows, sizeof (int *));' – BLUEPIXY

+0

그래, 그게 다야! 감사. – Miguel

+1

코드에 2D 배열이 없습니다. 포인터가 배열이 아닙니다. – Olaf

답변

4

당신은 당신의 은유를 혼합하고 있습니다. 배열 포인터를 포인터에 대한 포인터 블록으로 선언 한 다음 int 크기의 메모리 블록을 할당합니다. 포인터의 크기가 int의 크기 인 곳에서이 문제를 해결할 수는 있지만 여전히 올바르지 않습니다.

가장 간단한 옵션은 행과 열의 스트라이드 (예 : array[row*ncolumns + column])로 액세스하는 간단한 1D 배열로 만들거나 포인터를보다 철저하게 사용하는 것입니다.

컴파일러에서 내부 배열의 크기를 알 수 없으므로이 배열을 동적으로 할당 된 2D 배열에 액세스하는 데 배가 된 배열 구문을 사용할 수 없으므로 외부 배열의 보폭으로 사용할 수 없습니다.

+0

좋아, 의견을 주셔서 감사합니다. – Miguel