2013-10-22 70 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);