2012-07-22 3 views
-4
void f(int **m, int w, int h) 
{  
int i,j; 

    for(i=0;i < w ; i++) 
    {  
     for(j=0;j<h;j++) 
     { 
     printf("%5d", m[i][j]); // *(*(m + i) + j) ?? 
     } 

    printf("\n"); 
    } 
    return; 
} 


int main() 
{ 

int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 


f(a,3,3); 

} 

이 코드는 2 차원 행렬 을 인쇄하려고하지만 세그먼트 오류가 발생합니다.왜이 코드가 seg 오류를 throw합니까

+3

매트릭스 생성 코드 란 무엇입니까? –

+1

아마 배열 끝에서 벗어나고있을 것입니다. 우리는 m의 선언과 할당을 볼 필요가 있습니다. h, – pb2q

+2

이것은 내가 본 가장 빠르다 downvote 나선형입니다. –

답변

1

매트릭스의 유형이 int **이 아니며, 유형이 int[3][]입니다.

int **은 포인터 배열에 대한 포인터를 의미합니다. 당신은 포인터의 배열을 가지고 있지 않다. 당신은 3 정수 배열의 배열을 가지고있다. 똑같은 것이 아닙니다.

원하는 경우이를 고려하여 코드를 변경할 수 있습니다.

int *addr = (int *)m; // This is the address of m[0][0] 

사용 m [I] [J]를 액세스하려면

int elem = addr[i*h+j]; 
+1

설명하려면 (매개 변수) : http://ideone.com/sbEb5 – chris

+0

그게 내가 뭐야? 생각 ...이 다섯 투표를 통해이 질문을하게되었습니다. \t stackoverflow.com/questions/10625547/pass-matrix-as-argument – GionJh

1

포인터 포인터에 int로하면 3x3 배열과 동일하지 않다.

당신은 다른 함수를 선언하거나 다르게 배열 준비해야 하나 :

변경 f을 여기에 :

void f(int m[][3], int w, int h) 

을 또는이 같은 배열 준비 :

int r0[] = {1,2,3}; 
int r1[] = {4,5,6}; 
int r2[] = {7,8,9}; 
int *a[] = {r0,r1,r2}; 
f(a,3,3); 
1
int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 

f으로 전달하면 작동하지 않습니다. a의 유형이 f 예상과 호환되지 않습니다. 함수에 전달하면 aint (*)[3] 유형의 포인터로 변환되고 배열은 3의 포인터 int으로 변환됩니다.

f 포인터가 int 인 포인터가 있어야합니다. 컴파일러가 호환되지 않는 형식에 대해 알려 줬어야합니다.

정의되지 않은 동작은 mf에 역 참조하는 경우 배열 내용의 첫 번째 sizeof(int*) 바이트가 포인터로 해석되고이어서 할당되지 않은 메모리에 액세스합니다.

관련 문제