6

malloc を使用して double ポインターを作成する関数を作成する必要があります。

これは、通常どおりに二重ポインターを宣言する方法です。

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

なぜこれが機能しないのですか?

4

4 に答える 4

9

もう1つの「間接化」が必要です。つまりG、ポインターへのポインターからフロートへのポインターのように参照渡しします。

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

そして、それを次のように呼び出します

mallocDoubleArr(&G, numNodes);

mallocDoubleArrたとえば、それに応じて変更します

(*arr)[i] = malloc(size*sizeof(double));
于 2013-10-22T18:14:47.803 に答える
3

まず、行を変更する必要があります

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

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

(ポインターに何かを割り当てるまで、ポインターを安全に逆参照することはできません。)

次に、関数は渡されたポインターを変更するため、それへのポインターが必要です。あなたの署名は代わりに

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

また、ポインターが指しているポインターにアクセスするには、コードに関連する間接参照を追加する必要があります。

私の意見では、ポインターを使用する初心者にとって多くの混乱は、それらが通常の古い変数とは異なるものであると考えることに起因します。int、float などのポインターは、スタック上に存在する単なる変数です。それらにはアドレスがあり、同じ方法で関数に渡されます。関数内の変数 (int、float、ポインターなど) を変更する場合は、ポインターを渡す必要があります。この点で違いはありません。

于 2013-10-22T18:15:58.270 に答える
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);
于 2015-11-02T05:29:59.483 に答える