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

}

このコードは 2D マトリックスを印刷しようとしていますが、セグメンテーション エラーが発生します。

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は期待される型と互換性がありません。関数に渡されると、型のポインター、つまり 3 つの配列aへのポインターに変換されます。int (*)[3]int

fへのポインタへのポインタが必要intです。コンパイラは、互換性のない型について通知しているはずです。

未定義の動作が発生します。おそらく で逆参照mすると、配列の内容fの最初のsizeof(int*)バイトがポインタとして解釈され、その後に続き、未割り当てメモリにアクセスすることになります。

于 2012-07-22T18:11:16.897 に答える