2012-07-22 66 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); 

} 

这段代码试图打印二维矩阵 但我得到一个分段错误。为什么会发生这种代码抛出赛格故障

+3

什么是您的矩阵创建代码? – 2012-07-22 18:02:03

+1

你可能走出阵列的末端。我们需要看到声明/分配的m和值为w,h – pb2q 2012-07-22 18:02:09

+2

这是我见过的最快的downvote螺旋:) – 2012-07-22 18:03:05

回答

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 2012-07-22 18:09:18

+0

这就是我认为......这五个投票让我问这个问题\t stackoverflow.com/questions/10625547/pass-matrix-as-argument – GionJh 2012-07-22 18:13:09

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预期的类型不兼容。当传递给函数时,a被转换为类型为int (*)[3]的指针,指向三个数组的指针int

f需要指向指向int的指针。你的编译器应该告诉你关于不兼容的类型。

,会发生什么是未定义的行为,可能是当在f解除引用m,第一sizeof(int*)字节数组内容解释为一个指针和随后,导致访问未分配存储器。

相关问题