将2D数组转换为双指针失败

时间:2017-10-15 12:07:50

标签: c arrays pointers multidimensional-array segmentation-fault

初始化2D数组矩阵,如下所示:

#define N 3
...
int matrix[N][N] = {};

可以按如下方式访问矩阵的元素:

for(i=0; i<N; ++i)
{
    for(j=0; j<N; ++j)
        printf("%d ", *(*(matrix + i) + j) );
    printf("\n");
}

但是,以下代码因分段错误而失败。

int **matrix_pointer = (int **)matrix;
for(i=0; i<N; ++i)
{
    for(j=0; j<N; ++j)
        printf("%d ", *(*(matrix_pointer + i) + j) );
    printf("\n");
}

请解释为什么或建议一种有效的替代方法(带指针)。

1 个答案:

答案 0 :(得分:0)

如果定义

int matrix[3][5];

添加然后只将matrix放在= - 运算符的右侧,数组matrix衰减(就像每个数组一样)到它的第一个元素的地址。

matrix的第一个元素是int[5]int[5]的地址为int(*)[5]

如果“只将matrix放在= - 运算符的右侧”,则此分配操作的左侧应为{{1} }:

int(*)[5]

了解上述内容显然是在做

int (*row)[5] = matrix;

无法正确,因为int ** ppi = matrix int **不同。

它指向另一个不同指针的指针,会说不兼容的类型。编译器会警告这一点。

对右侧表达式应用强制转换以适合左侧,只是告诉编译器关闭。