2012-04-16 3 views
1

저는 C++을 처음 접했고 포인터를 배우려고합니다. 실습으로 포인터에 대한 포인터를 사용하여 nxn 행렬을 읽으려고합니다. 이것은 지금까지 시도했지만 scanf가 실패했습니다. 내가 뭘 잘못 했니?
나중에 편집 :포인터를 사용하여 nxn 행렬을 읽는 방법은 무엇입니까?

int **matrix; 
int i=0; 
int j=0; 
int li=0; 
int dim; 

printf("What is the dimmension:"); 
scanf("%d",&dim); 
matrix=(int **)malloc(sizeof(int *) * dim); 
for(li=0;li<dim;li++) 
{ 
    matrix[li] = (int *)malloc(sizeof(int) * dim); 
} 
printf("Type the elements:\n"); 
for(i=0;i<dim;i++) 
{ 
    for(j=0;j<dim;j++) 
    { 
     scanf("%d", matrix[i][j]); 
    } 
} 

답변

0

당신이 scanf은 또한 당신이 포인터 자체를 할당 할 필요가

scanf("%d", &matrix[i][j]); 

편집의 위치를 ​​사용하기위한 다음 일반 2D 배열 matrix[i][j]처럼 액세스 할 수 있어야합니다 : 또한

matrix=(int **)malloc(sizeof(int *) * dim); 
for(i = 0; i < dim; i++) { 
    matrix[i] = (int *)malloc(sizeof(int) * dim); 
} 

이 직선 인 경우 C 당신이 캐스팅 안 C가 자동으로 업그레이드되고 캐스트가 버그를 숨길 수 있기 때문에 malloc에서 반환 유형을 반환합니다.

+2

이 아마 세그멘트 폴트로 이어질 것입니다 (물론, C++에서 당신은 일반적으로하지 malloc하지만 new 및/또는 표준 라이브러리에서 제공하는 다른 유형의. 사용하는 것). –

+0

@OliCharlesworth 나는 그것을 보았고 그것에 따라 나의 대답을 편집했다. – twain249

0

포인터의 최상위 배열을 할당했지만 할당 된 메모리에 대한 포인터의 다음 수준을 설정하지 않았습니다. 각 포인터 matrix [i]에 대한 청크를 malloc하기위한 루프를 만들거나 각 포인터를 기존의 할당 된 메모리로 설정 한 다음 scanf에서 사용할 수 있습니다. 당신은 C를 사용하는 경우

2

당신이 포인터 행에 각 지점, 당신은 실제로에 대한 포인터를 만들기 위해 필요한 포인터의 배열을하려고하는 경우 ++ 더 나은이이

matrix = new int*[dim]; 
for(int = 0; i < dim; ++i) 
    matrix[i] = new int[dim]; 

// to read matrix 
scanf("%d", matrix[i][j]); 
+1

이것은 맞습니다. 그것은 틀림없이'std :: array' (또는'boost :: multi_array')를 사용하는 더 관용적 인 (현대의 C++에서는) 관용적이지만 말이죠. –

0

좋아해요 각 행 너 자신. 여기에 코드입니다 :

// 형성 * N (또는 N * N)

int **a; 
a=malloc(M*sizeof(int *)); 
for(i=0;i<M;i++) 
    a[i] = &aa[i][0]; 

그 코드와 함께, 당신은 큰의 malloc에 ​​AA 포인터를 할당 한 다음에 malloc에 ​​덩어리를 할당 각 행의 첫 번째 요소! 이렇게하면 기존 2 차원 배열 a [0] [0], a [1] [1], ec를 사용하여 배열의 참조를 해제 할 수 있습니다. 당신은이 (반) 주요 옵션이 http://www.eskimo.com/~scs/cclass/int/sx9b.html

1

: 다음은이 설명에 최선 참조입니다. 당신은

matrix = malloc(dim * sizeof(int*)); // gives you dim int* 
for(i = 0; i < dim; ++i) 
{ 
    matrix[i] = malloc(dim * sizeof(int)); // row i gets dim int 
} 

, 개별적으로 각 행을 할당 할 수 있습니다 또는

array[i*dim + j]; 

로 절반 옵션은 포장 된 메모리 레이아웃을 사용하는 것입니다 연속 덩어리

int *array = malloc(dim*dim*sizeof(int)); 

및 액세스를 할당 할 수 있지만, matrix[i][j]으로 액세스 할 래퍼가 있습니다.

int **matrix = malloc(dim*sizeof(int*)); 
for(i = 0; i < dim; ++i) 
{ 
    matrix[i] = array + i*dim; 
} 

영업의 코드로

+0

+1. 당신의 것을 알아 채고 나서 제 대답을 삭제했습니다. (제 첫 번째 부분이었습니다 :) – Saphrosit

관련 문제