簡體   English   中英

寫一個函數到malloc雙指針

[英]Write a function to malloc double pointer

我需要編寫一個使用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 ,就像指向指向float的指針的指針一樣:

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

然后將其稱為

mallocDoubleArr(&G, numNodes);

相應地修改mallocDoubleArr ,例如

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

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的帖子是在我寫作時寫的。 對不起任何重疊。]

對於初學者,您需要更改線路

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

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

(在你為它指定了東西之前,你不能安全地取消引用指針。)

其次,你的函數修改了傳入的指針,所以你需要一個指向它的指針。 你的簽名應該由

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

並且您需要在代碼中添加相關的間接,以訪問指針指向的指針。

對於使用指針的初學者而言,很多困惑來自於我認為它們與常規舊變量不同的東西。 指針,如整數,浮點數等只是存在於堆棧中的變量:它們具有地址,並且它們以相同的方式傳遞給函數。 如果要在函數中更改變量(int,float,pointer等),則需要將指針傳遞給它。 這方面沒有區別。

我用於矩陣運算代碼,如下所示,用於分配和釋放。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM