0

ここでセグメンテーションを取得します。ただし、配列を int** として宣言し、malloc を使用すると、正常に動作します。

#include <stdio.h>

void display(int **p,int numRows,int numCols) //Second Method//
{
    printf("\n");
    int i,j;
    for (i = 0; i< numRows;i++)
    {

        for (j = 0;j< numCols;j++)
        {
            printf("%d\t",p[i][j]);
        }
        printf("\n");
    }
}

int main() {

    int arr[2][2]={{1,2},{4,5}};
        display(arr,2,2);
}

PS別の方法は必要ありません。このコードが機能しない理由を教えてください。

4

3 に答える 3

4

警告を無視しないでください

expected int **' but argument is of type 'int (*)[2]

arr2 つの整数の 2 つの配列の配列です

使用する :

void display(int p[][2],int numRows,int numCols)

于 2013-09-05T04:25:33.577 に答える
3

Anint**はポインターへのポインターですが、 はint [2][2]2 つの配列を連続して格納します。それはあなたの間違いです。

を使用int x[2][2]するx[1]と、2 つの要素の 1 つのセットをスキップしてメモリにアクセスするようにコンパイラに指示し、結果の式は 2 つの要素の配列になります。を使用int** xすると、ポインタを 1 つx[1]スキップしてメモリにアクセスするようにコンパイラに指示します。どちらも同じ方法でデータにアクセスしますが、2 つのデータの配置は同じではありません。

メモリでは、x[2][2] = {{1, 2}, {4, 5}}次のようになります。

// 4 contiguous elements
01 00 00 00  02 00 00 00    04 00 00 00  05 00 00 00

次のようにint** x見えますが:

// pointers to integers
aa bb cc dd  aa ab ac ad
// At [aa bb cc dd]:
    01 00 00 00  02 00 00 00
// At [aa ab ac ad]:
    04 00 00 00  05 00 00 00

したがって、 に適応するには、ポインタint**の配列をint*動的に作成し、各エントリを配列の下位次元に設定する必要があります。

于 2013-09-05T04:27:06.973 に答える