为什么在将双指针用作二维数组的参数时出现“分段错误”?

时间:2019-06-05 12:12:28

标签: c arrays pointers

问题在于输入4X5矩阵并将其每一行向左圆移2个位置。就像输入为{1,2,3,4,5}一样,输出应为{3,4,5,1,2}。我为相同的代码编写了以下代码。但是我收到“分段错误(核心已转储)”错误。你能帮我吗另外,我对于发送二维数组以使用** p参数也有点敏感。也请对此发表评论。我想知道为什么会出现错误。

#include <stdio.h>
void shift(int **);
int main()
{
    int i,j,a[4][5];
    printf("Enter the elements of the 4X5 matrix:\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    printf("Entered Matrix:\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");

        shift(a);

        printf("The new array is:\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return 0;
}

void shift(int **p)
{
    int i;
    for(i=0;i<4;i++)
    {
        int temp[2] = {**(p+i),*(*(p+i)+1)};
        *(*(p+i)+0) = *(*(p+i)+2);
        *(*(p+i)+1) = *(*(p+i)+3);
        *(*(p+i)+2) = *(*(p+i)+4);
        *(*(p+i)+3) = temp[0];
        *(*(p+i)+4) = temp[1];
    }
}

预期结果-旋转数组 实际结果-分段错误(核心转储)

1 个答案:

答案 0 :(得分:1)

像这样访问2D数组的数组元素仅适用于2D数组。而不是像这样声明它:

void shift(int **p)

您应该将其更改为此:

void shift(int p[4][5])

与该函数的原型相同。 Click here进行演示。