[英]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.