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

时间:2018-04-28 18:59:14

标签: c arrays

我试图通过分配指针来打印二维数组。有了这个,我可以打印一维精细,但2维导致分段错误。

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)

如果我可以通过分配(sa)(我可以打印int *sa = singleArray;)来访问 1D数组 sa[i],那么为什么我无法访问 2D数组 (da) int **da = dualArray;?我访问 2D数组时出现分段错误。

有人请让我知道原因。 感谢。

2 个答案:

答案 0 :(得分:1)

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

您需要知道指向指针的指针 2D数组的数组数组不同。您必须知道C实际上没有二维或更高维的数组:它们只是数组的数组。如果希望2D数组是指向指针的指针,则应使用动态内存。请参阅How to pass 2D array (matrix) in a function in C?了解如何传递2D数组,然后打印出结果。

我也不完全理解您的代码。在您的代码中,您声称它适用于1D阵列,但它不适用于2D阵列。但是,您的代码根本不使用行或col,而是生成预设的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     

答案 1 :(得分: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.双指针主要用于声明时我们不知道2D数组的实际大小,&amp;我们动态地制作它。

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

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

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

5.我已经使用双指针 dda 指向指针数组 da ,其中有两个元素将是指针本身。

休息我已通过计划中的评论进行了解释。

可能会有所帮助。