2013-12-19 3 views
0

나는 C 언어를 배우기 때문에 배열 (사용자가 가져온 배열의 크기)에 메모리를 할당하려고 시도했지만 세그먼트 오류가 발생한 후 그것을 초기화하십시오.동적 배열 2 차원 배열 및 초기화 (조각화 오류)

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

int main() 
{ 
    printf("give the dimensions!\n"); 
    int row,col,i,j; 
    int **myArray; 

    printf("\nrows = "); 
    scanf("%d", &row); 
    printf("columns = "); 
    scanf("%d", &col); 
    myArray = malloc(row*sizeof(*myArray) + col*sizeof(**myArray)); 

    printf("Init the array: \n"); 
    for (i = 0; i < row; i++) 
    { 
     for (j = 0; j <col ; j++) 
     { 
      scanf("%d", &myArray[i][j]); 
     } 
    } 

    return 0; 
} 

내가 myArray[2][2]로 배열을 변경하고 잘 작동하는 malloc에 ​​문을 생략하면 ..

+0

추가 공간 scanf와 '에 ("%의 D"를,에서 myArray [I] [J])'는 사실을 할당하는 비즈니스에 대해 설정되면 2D 배열 –

답변

4

는 C는 인덱싱 작업을 가정하는 방법을 알 수있는 방법은 없습니다 : myArray와 열 수 (col)를 연관 아무런 정보가 없습니다. 이 int * *으로 선언 된 myArray[i][j]을 수행하면 C는 먼저 myArray[i]의 i 값을 계산합니다. 즉, myArray의 i : th 값을 마치 정수 포인터 인 것처럼 읽습니다. 그런 다음 유효하지 않은 값에서 j을 인덱싱하여 세분화 오류를 생성 할 가능성이 있습니다 (적어도 정의되지 않은 동작이 발생하는 경우). 각 행은 해당 행의 요소에 자신의 포인터를이 곳

  • , 그것은 "들쭉날쭉"확인 : 그런 수동으로 수행 할 때

    , 당신은 두 가지 선택이있다. 이것은 his answer에 @bgamlath가 제안한 것입니다.

  • myArray[i][i]myArray[i * cols + j]으로 바꾸어 색인을 생성하십시오.

후자는 할당량이 적은 메모리와 방법을 사용하므로 좋은 결과를 얻을 수 있습니다. 물론 색인 생성은 약간 어색 할 수 있습니다.

1

는 다음과 같이 그 일을 시도 : 내 코드는 이것이다.

table = malloc(row*sizeof(int *)); 
    for(i = 0; i<row; i++) 
    table[i] = malloc(col * sizeof(int)); 
+0

그래, 난 그냥 내 비슷한 다른 질문을 보았다 http://stackoverflow.com/questions/19059151/segmentation-fault-on-initializing-a-2d-array?rq=1 thx !!! – yaylitzis

+0

이것은 2D 배열이 아니며 포인터 기반의 룩업 테이블입니다. 2D 배열은 인접 메모리에 할당됩니다. [이것은 2D 배열을 할당하는 방법입니다.] (http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free-a-multidimensional-array-in-c). – Lundin

0

이와 같이 동적 배열을 할당 할 수 있습니다. 아니 malloc 필요합니다.

{ 
    printf("rows = "); 
    scanf("%d", &rows); 
    printf("columns = "); 
    scanf("%d", &cols); 

    int my_array[rows][cols]; 
} 

새로운 배열 제로 :

memset(my_array, 0, rows*cols*sizeof(int)); 
+1

은 C99 이후에만 제공되며 입력이 너무 크지 않아서 스택이 오버플로합니다. –

+0

절대적으로. C99 이상을 사용하지 않는 사람은'malloc'과'free'를 고수해야합니다. @ Nat95는 그가 초보자라는 것을 알려주므로, 나는 1) 그가 찾고있는 다차원 배열을 포함한 표기법의 편의성, 2) 'malloc'과 '자유'를 둘러싼 끝이없는 C 초보자 오류의 자유 '. –