C语言 将函数写入 malloc 双指针



我需要编写一个使用 malloc 创建双指针的函数。

这就是我像往常一样声明双指针的方式:

double **G; //Create double pointer to hold 2d matrix
*G = malloc(numNodes * sizeof(double*));
for(i = 0; i < numNodes; i++)
{
    G[i] = malloc(numNodes*sizeof(double));
    for (j = 0; j < numNodes; j++)
    {
        G[i][j] = 0;
    }
}

现在我尝试将其替换为:

double **G;
mallocDoubleArr(G, numNodes);

函数为:

void mallocDoubleArr(double **arr, int size)
{
    int i, j;
    *arr = malloc(size * sizeof(double*));
    for(i = 0; i < size; i++)
    {
        arr[i]= malloc(size*sizeof(double));
        for (j = 0; j < size; j++)
        {
            arr[i][j] = 0;
        }
    }
}

为什么这不起作用?

你需要再做一个"间接",换句话说,通过引用传递G,就像指向指向浮点的指针的指针一样:

void mallocDoubleArr(double ***arr, int size);

然后称其为

mallocDoubleArr(&G, numNodes);

相应地修改mallocDoubleArr,例如

(*arr)[i] = malloc(size*sizeof(double));

对于初学者,您需要更改行

*G = malloc(numNodes * sizeof(double*));

G = malloc(numNodes * sizeof(double*));
(在为

指针分配某些内容之前,无法安全地取消引用指针。

其次,你的函数修改传入的指针,所以你需要一个指向它的指针。您的签名应改为

void mallocDoubleArr(double ***arr, int size)

并且需要在代码中添加相关的间接寻址以访问指针指向的指针。

在我看来,对于使用指针的初学者来说,很多困惑来自于认为它们与常规旧变量不同。指针,如 int、floats 等,只是存在于堆栈上的变量:它们有地址,并且以相同的方式传递给函数。如果要更改函数中的变量(int,float,指针等),则需要传递指向该变量的指针。在这方面没有区别。

C 是按值调用的。在

double **G;
mallocDoubleArr(G, numNodes);

您正在将一个未初始化的变量传递给 mallocDoubleArr。它可能是零,也可能是别的东西,但几乎可以肯定它不是mallocDoubleArr可以分配给的东西。

我们可以更改代码和函数的定义以传入 G 的地址,但随后您将处理另一级指针。这可能会使理解代码变得更加困难。如果这真的不是必需的,我建议让 mallocDoubleArr 返回一个双精度**。

double **G;
G = mallocDoubleArr(numNodes);
double **mallocDoubleArr(int size)
{
    int i, j;
    double **arr;
    arr = (double **) malloc(size * sizeof(double *));
    /* continue with old code */
    return arr;
}

[编辑:Bstamour的帖子是在我写我的帖子时发布的。很抱歉有任何重叠。

我用于矩阵运算代码,如下所示用于分配和释放。

int **inputMatrix, i, j;
Grid myGrid = *grid;
inputMatrix = (int *) calloc (myGrid.num_nodes, sizeof(int*));
for(i=0; i < myGrid.num_nodes; i++){
    inputMatrix[i] = calloc(myGrid.num_nodes, sizeof(int));
    for(j=0;j<myGrid.num_nodes;j++){
        inputMatrix[i][j] = 0;
    }
};
for(i=0; i < myGrid.num_nodes; i++){
    free(inputMatrix[i]);
}
free (inputMatrix);

相关内容

  • 没有找到相关文章

最新更新