1

我有一个创建二维数组的函数:

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

现在我可以创建一个二维数组:

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

我还有一个函数,例如,它可以转置我的“矩阵”(二维数组):

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函数中分配新矩阵,而是在现有数组中移动数字。您可以使用一个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

你不这样做。为此,您将需要两个变量。

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 多维数组”。

于 2012-08-17T07:27:18.953 回答