我有一个像这样返回逆矩阵的函数:
double** inverse(double (**data)) {
double result[2][2];
result[0][0] = data[1][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
return result;
}
我检查了结果中的值,它们是正确的。然后:
double** s = inverse(gama[FreIdx]);
printf("%f\n", s[0][0]);
我得到了异常。读取位置0x0时发生访问冲突......我对C不是很熟悉。谁能告诉我发生了什么?
您正在逆向静态地创建一个矩阵,这意味着它将驻留在该函数调用的堆栈帧内。然后你返回那个矩阵的地址,但是一旦你返回函数,它的栈帧就可以被覆盖。
您需要动态分配矩阵,并记得在不需要时尽快释放它。
double** inverse(double data[][2]) {
double **result = malloc(sizeof(double*) * 2);
result[0] = malloc(sizeof(double) * 2);
result[1] = malloc(sizeof(double) * 2);
result[0][0] = data[1][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
return result;
}
并释放它:
double **inv = inverse(mat);
free(inv[0]);
free(inv[0]);
free(inv);
注意:最好创建一个析构函数来负责释放内部数组和外部数组。将 NULL 放入 inv
(您刚刚释放)也是一种很好的做法,以捕获释放后的潜在用法。