首页 > 解决方案 > 与双指针混淆 | 矩阵初始化

问题描述

我有以下代码处理使用双指针的读取矩阵。我想了解为什么作者会选择使用如下双指针:

int N=10;
int i,j;
open = (long double**)calloc(N+2, sizeof (long double*));
for(i=0;i<N+2;i++)
  open[i]=(long double*)calloc(N+2, sizeof (long double));

用法

long double coord[500][2];
for(i=0;i<N+1;i++){
    fscanf(fin,"%s %s",column1,column2);
    coord[i][0]=atof(column1);
    coord[i][1]=atof(column2);
for(i=0;i<N;i++){
    for(j=0;j<N;j++)
        open[i][j]=sqrt(pow(coord[i][0]-coord[j][0],2.)+pow(coord[i][1]-coord[j][1],2.));

我没有看到矩阵是如何用双指针初始化的,而只声明了一个数组open[i]而不是open[i][j]

标签: cmatrixdouble-pointer

解决方案


大概声明是

long double **open;

第一个malloc()分配一个指针数组。每个指针指向矩阵的一行。

循环中的malloc()调用for为矩阵的每一行分配内存。

这就是动态分配二维矩阵的方式。

由于您要分配 的矩阵long double,因此您需要在sizeof调用中使用该类型。

open = calloc(N+2, sizeof (long double*));
for(i=0;i<N+2;i++)
  open[i]=calloc(N+2, sizeof (long double));

推荐阅读