我在执行代码时遇到双重免费或损坏错误。本质上,我只是在C中创建一个矩阵(任何RxC维度,这就是使用指针的原因),交换两行,打印结果,然后尝试释放内存。当我不交换行时,释放工作完美。当我这样做时,它会崩溃。我试图改变交换的方式无济于事。我认为它与用于交换超出范围的临时指针有关,但我不确定这是否是问题以及我将如何修复它。
MatElement只是一个双倍。
typedef double MatElement;
主:
int main(int argc, char *argv[]) {
MatElement** matrix = matrixAlloc(3,3);
int i;
int j;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
matrix[i][j] = i+j;
}
}
matrixPrint(matrix, "%5.1f", 3, 3);
swapRows(matrix, 0, 2);
matrixPrint(matrix, "%5.1f", 3, 3);
matrixFree(matrix);
return 0;
}
分配矩阵的方式:
MatElement **matrixAlloc(int nr, int nc) {
int i;
MatElement *ptr;
MatElement **A;
A = malloc(nr * sizeof(MatElement *)); /* array of ptrs */
ptr = calloc(nr * nc, sizeof(MatElement)); /* matrix elements */
for (i = 0; i < nr; i++) /* set row pointers properly */
A[i] = ptr + nc * i;
return A;
}
他们获释的方式:
void matrixFree(MatElement **A) {
free(A[0]);
free(A);
}
交换行的方式:
void swapRows(MatElement** G, int pivotRow, int rowExamined) {
MatElement* temp;
temp = G[rowExamined];
G[rowExamined] = G[pivotRow];
G[pivotRow] = temp;
}
有没有人知道造成这个双重免费()/无效免费()的原因是什么?
答案 0 :(得分:3)
在某些时候,您正在将矩阵的第一行交换到另一个位置,因此free(A[0])
中的matrixFree()
试图将指针释放到数组的中间,而不是指针由calloc()
返回。您需要将原始指针保存在某个位置,以便您可以将其(未受干扰地)传递给free()
。
答案 1 :(得分:1)
您的矩阵看起来像这样:
A包含指向所有行的第一个元素的所有指针。所以最初,A [0]指向第0行,A [1]指向第1行,依此类推。
因此,当您尝试释放矩阵时,您知道A [0]指向第一行。但那时你假设你的矩阵元素处于连续位置,A [0]总是指向calloc返回的初始指针。但是当你交换一些行(特别是第0行和任何其他行)时,A [0]并不指向calloc返回的指针。
可能的解决方案就像在A中分配一个以上的内存插槽一样:
A = malloc(((nr + 1)* sizeof(MatElement )); / ptrs数组* /
然后将calloc返回的原始指针存储到A [nr]。
所以,A [nr]也会指向calloc返回的指针。