2013-10-22 68 views
4

我需要編寫一個函數,使用malloc創建一個雙指針。寫一個函數malloc雙指針

這是我宣佈我的雙指針,因爲我通常會:

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

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

現在我試圖取代它爲什麼這不起作用?

+0

您可以使用'calloc'保存一些作品。它基本上與'malloc'完全相同,但也將內存設置爲零,這意味着你可以消除你最內層的for循環。 – patrickvacek

回答

6

你需要一個更「間接」,換句話說,通過像指針的指針引用傳遞G的指針浮動:

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

然後調用它作爲

mallocDoubleArr(&G, numNodes); 

相應地修改mallocDoubleArr,例如

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

我會使用相同的方法來釋放,對吧? – Ace

1

F或初學者,您需要將線改變

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

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

(你不能解引用指針安全,直到你分配什麼東西。)

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

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

,你將需要添加在你的代碼中的相關間接尋址訪問指針所指向的指針。

對於使用指針的初學者來說,很多困惑都來自於我的觀點,認爲它們與普通的舊變量不同。指針,像ints,float等等只是棧上的變量:它們有地址,並且它們以相同的方式傳遞給函數。如果你想在一個函數中改變一個變量(int,float,pointer等),你需要傳遞一個指針給它。這方面沒有區別。

3

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

0

我用矩陣操作代碼如下分配和釋放。

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