无法通过指针分配访问二维数组

3
我想通过指针打印二维数组。使用这种方式,我可以很好地打印一维数组,但是打印二维数组会导致分段错误。
void printOutput(int **array,int row, int col)
{
    int i = 0, j = 0;
    int dualArray[2][2] = {{1,2},{3,4}};
    int singleArray[]={1,2,3};
    int *sa = singleArray;

    printf ("Output values :\n");
    for(i=0;i<3;i++)
        printf("%d ",sa[i]);
    printf("\n");

    int **da = dualArray;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {   
            printf("%d ",da[i][j]);
        }
        printf("\n");
    }
}

Output values :
1 2 3 
Segmentation fault (core dumped)

如果我通过赋值int *sa = singleArray;(我可以打印sa[i]),就可以访问1D数组(sa),那么为什么我不能访问2D数组(da) int **da = dualArray;?当我访问2D数组时,会出现分段错误。
请有经验的人告诉我原因。谢谢。

1
一个数组的数组和指向指针的指针不是同一回事。请参见我的这个旧答案,了解它们之间的区别。 - Some programmer dude
1
还要记住,数组会衰变为指向它们第一个元素的指针。对于singleArray来说,这是&signleArray[0],当然是int *类型。对于dualArray来说,这是指向int (*)[2]类型数组的指针&dualArray[0] - Some programmer dude
@Ajay 我想你的意思是 int (*da)[2] - user3386109
1
从gdb中我得到了这个错误信息:main.c: 在函数'printOutput'中: main.c:15:16: 警告:指针类型不兼容的赋值 [-Wincompatible-pointer-types] int **da = dualArray; - Ṃųỻịgǻňạcểơửṩ
1
我并不是很理解你的代码,因为它显然是错误的,因为它根本没有使用传递的数组、行或列。但是,我认为你正在构建一个函数来打印出一维或二维数组。我提供了一些示例代码供你使用。你使用了双数组还是指针数组? - Ṃųỻịgǻňạcểơửṩ
显示剩余5条评论
2个回答

1
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int row=2,col=3;
    int i = 0, j = 0;
    int dualArray[2][3] = {{1,2,5},{3,4,6}};
    int singleArray[]={1,2,3};
    int *sa = singleArray;

   printf ("Output values :\n");
   for(i=0;i<3;i++)
       printf("%d ",sa[i]);
    printf("\n");

    int **dda;   //Double pointer

    int *da[2];  //It is array of two pointer 
                 //Means it will store two elements, which will be some pointer themselves

    dda=da;      //array name is pointer to first element so here dda is pointing to first element of da
    int (*ss)[3]=dualArray;  //Here ss is pointer to array of 3 element
    da[0]=ss;                //am storing this pointer at da[0], comprising of first row
    ss=ss+1;                 //Now ss is incremented, it will increment by its size.
                             //sizeof(*ss) is 12 bytes, 3elements x sizeof(int)
    da[1]=ss;                //So now ss points to second row, 
                             //Pointer to second row is stored in da[1]


    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {   
            printf("%d ",*(*(dda+i)+j)); //de-referencing twice to get the element as done in @D array
        }                               //But here dda double pointer
        printf("\n");
    }


}

我已经将您的代码修改为主函数,这样您就可以直接运行它并查看其输出。

考虑以下有用的事情:

1.双指针大多用于在声明时不知道2D数组的实际大小,而我们正在动态制作它的情况下使用。

2.当一个2D数组被传递到函数中时,它会衰减为指向数组的指针;即指向包含与行中列数相同数量元素的数组的指针。因此,指向第一行数组的指针被传递到我们接收它的函数中。

3.如上所述,2D数组并不是作为指向指针的指针传递的,而是作为指向数组的指针传递的(如果您只是传递双指针,那么函数应该知道每行有多少列数字? 它怎么知道呢?)

4.为了说明函数中的双指针,我做了一些更改,也解释了它们。

5.我取了名为dda的双指针,它指向具有两个元素的指针数组da,它们本身将是指针。

其余部分我已经在程序中通过注释进行了解释。

也许这会有所帮助。


0

你是否在尝试构建一个函数,它接收一个二维指针(必须是二维的)以及其维度,并打印出其内容?

需要注意的是,指向指针并不同于二维数组,即数组的数组。您必须了解,在 C 中并没有真正的二维或更高维的数组:它们只是数组的数组。如果您想要这个二维数组成为指向指针的形式,则应使用动态内存。请参见 如何在 C 函数中传递 2D 数组(矩阵) 以了解如何将二维数组传递给函数并打印出结果。

我也不完全理解您的代码。在您的代码中,您声称它适用于 1D 数组,但它对于 2D 数组无效。然而,您的代码根本没有使用行或列,而是生成预设的 1D 和 2D 数组。

此外,您不能重载C函数。因此,printOutput只能支持1D或2D数组。以下是我编写的适用于2D数组的示例代码以及示例输入输出:
void printOutput(int row, int col, int array[row][col])
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {   
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int m1[2][2] = {{1,2},{-2,0}};
    int m2[3][3] = {{1,5,6},{3,2,7},{8,4,9}};
    int m3[2][5] = {{0,1,2,3,4},{5,6,7,8,9}};
    int m4[1][7] = {{-3,-2,-1,0,1,2,3}};

    printOutput(2, 2, m1);
    printOutput(3, 3, m2);
    printOutput(2, 5, m3);
    printOutput(1, 7, m4);
    return 0;
}

输出将会是:

1 2                                                                                                                              
-2 0                                                                                                                             

1 5 6                                                                                                                            
3 2 7                                                                                                                            
8 4 9                                                                                                                            

0 1 2 3 4                                                                                                                        
5 6 7 8 9                                                                                                                        

-3 -2 -1 0 1 2 3     

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接