1

2D配列を作成する関数があります:

float** createMatrix(int x, int y){
    float** array= malloc(sizeof(float*) * y);
    for(int i=0; i<y; i++)
        array[i] = malloc(sizeof(float) * x);
    return array;
}

これで、2D 配列を作成できます。

    float** temp=createMatrix(2,2);

たとえば、「マトリックス」(2D配列)を転置する関数もあります。

float** matrixTranspose(float** m, int x, int y){
    float** result=createMatrix(y, x);
    for(int i=0; i<y; i++){
        for(int j=0;j<x; j++) result[j][i]=m[i][j];
    }
    return result;
}

今私がこれを行うと:

temp=matrixTranspose(temp,2,2);

以前にtempに割り当てられた古いメモリはどうなりますか? 私の転置関数は、新しいメモリ チャンクを割り当てます。明らかに、転置後に「古い一時」を何らかの形で解放する必要がありますが、どのように(エレガントに)?

4

4 に答える 4

3

free割り当てをミラーリングできます:

int i;
for(i = 0; i < y; i++)
    free(array[i]);
free(array);

tempしかし、によって作成された新しい行列に割り当てると、matrixTransposeそのメモリへのポインターが失われます。したがって、別のポインターでそれを追跡するか、結果をmatrixTranspose別のポインターに割り当てます。

float **transposedMatrix = matricTranspose(...);

行列を変更可能と見なす場合は、それらをその場で転置することもできます。関数に新しい行列を割り当てるのではなくmatrixTranspose、既存の配列内の数値を移動します。これは 1 つの場所で行うことができますfloat temp

于 2012-08-17T06:30:00.203 に答える
2

を呼び出すときは、別の変数 (ポインター) を使用しますmatrixTranspose。次に、free行列を記憶する関数を書きます。

このような:

float** newTemp = matrixTranspose(temp,2,2);
freeMatrix( temp );
temp = newTemp;

そうしないと、指定されたメモリが失われtemp、メモリ リークが発生します。

freeMatrix割り当てメモリに対して対称である必要があります。

for(int i=0; i<y; i++)
    free( array[i] );
free( array );
于 2012-08-17T06:29:51.267 に答える
1

あなたはこれをしません。これには 2 つの変数が必要です。

float **tmp2 = matrixTranspose(temp, 2, 2);

そして行列のデアロケータ関数を書きます:

void freeMatrix(float **m, int x) {
    int i;
    for (i = 0; i < x; i++) {
      free(m[i]);
    }
    free(m);
}

そうして初めて、あなたは割り当てることができます

temp = tmp2;
于 2012-08-17T06:32:41.513 に答える
0
int FreeMatrix(char **matrix, int x, int y) {
  int i;
  for(i=0; i<y; i++) {
    free(matrix[i]);
  }
  free(matrix);
}

ここで、あまり洗練されていない部分は、割り当てられた範囲を追跡する必要があることです。これを処理するにはさまざまな方法がありますが、ほとんどの場合、それらを追跡する必要があります。たとえば、malloc と free をラップすることです。「malloc フリーの多次元配列」については Google で検索してください。

于 2012-08-17T07:27:18.953 に答える