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)

如果我可以通过分配(我可以打印)访问一维数组 ,那么为什么我不能访问二维数组访问2D array时出现分段错误。(sa)int *sa = singleArray;sa[i] (da) int **da = dualArray;

有人请告诉我原因。谢谢。

4

2 回答 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");
    }


}

在这里,我已将您的代码修改为 main 函数,以便您可以直接运行它并查看其输出。

考虑以下会有所帮助的事情。

1.双指针主要用于在声明时我们不知道二维数组的实际大小,并且我们动态地制作它。

2.当将二维数组传递给函数时,它会衰减为指向数组的指针;即指向元素数量数组的指针,因为一行中有列。因此,指向第一行数组的指针被传递给我们接收它的函数。

3.正如我上面所说的,二维数组不是作为指针传递的,而是作为指向数组的指针传递的(你也可以认为函数应该知道行中有多少列?如果你只是传递双精度指针。它怎么知道??)

4.为了在你所采取的功能中说明双指针,我做了一些我也解释过的改变..

5.我采用了双指针dda,它指向指针数组da有两个元素,它们本身就是指针。

休息我已经通过程序中的评论进行了解释。

可能这会有所帮助。

于 2018-04-29T12:11:24.843 回答
0

您是否正在尝试构建一个函数,该函数接收二维指针(必须是二维的)及其尺寸并打印出其内容?

您需要知道指向指针的指针2D 数组(也称为数组数组)不同。你必须知道 C 并没有真正的二维或更高维数组:它们只是数组的数组。如果您希望 2D 数组成为指向指针的指针,则应使用动态内存。请参阅如何在 C 中的函数中传递二维数组(矩阵)?了解如何传入二维数组,然后打印出结果。

我也不完全理解你的代码。在您的代码中,您声称它适用于一维数组,但不适用于二维数组。但是,您的代码根本不使用 row 或 col,而是生成预设的 1D 和 2D 数组。

此外,您不能重载 C 函数。因此,printOutput要么支持一维数组,要么支持二维数组。这是我的示例代码,它适用于二维数组以及示例输入输出:

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     
于 2018-04-28T19:54:30.630 回答