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

6

arr是 2 个 2 的数组int。当它在表达式中使用而不是一元&sizeof运算符的主题时,它的计算结果为指向其第一个元素的指针。

这是一个“指向 2 数组的指针int”,即 type int (*)[2]。它不是指向指针的指针int,它是类型int **。此外,这些类型不兼容,您不能将前者传递给期望后者的函数。

Anint **必须指向本身就是指针的东西。您传递给display的指针指向一个数组,而不是指针。

于 2013-09-05T04:25:15.463 回答
4

请不要忽视警告

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

arr是由 2 个整数组成的 2 个数组的数组

利用 :

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

于 2013-09-05T04:25:33.577 回答
3

anint**是指向指针的指针,而 anint [2][2]连续存储两个数组。那是你的错误。

使用int x[2][2],当你这样做时x[1],你告诉编译器通过跳过一组两个元素来访问内存,结果表达式是一个包含两个元素的数组。当int** x你这样做时,你告诉编译器通过跳过一个指针x[1]来访问内存。虽然您以相同的方式访问两者的数据,但两者的布局方式根本不同。

在内存中,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 回答