-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);

}

此代码正在尝试打印二维矩阵,但出现分段错误。

4

3 回答 3

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];
于 2012-07-22T18:08:16.680 回答
1

指向指向 an 的指针与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);
于 2012-07-22T18:10:50.330 回答
1
int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}};

将其传递给f不起作用,的类型与期望a的类型不兼容。f当传递给一个函数时,a被转换为一个类型的指针int (*)[3],指向三个数组的指针int

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

发生的是未定义的行为,可能在取消引用min时f,数组内容的第一个sizeof(int*)字节被解释为指针并跟随,导致访问未分配的内存。

于 2012-07-22T18:11:16.897 回答