malloc():矩阵逆的顶部大小损坏
malloc(): corrupted top size for matrix inverse
我正在尝试创建一个矩阵计算器,但当我尝试使用反函数时,我收到一条错误消息“malloc():损坏的最大尺寸”。我不知道这个错误是什么意思以及如何解决它。
这是我的代码:
double** inverse(double *mat[], int n){
//identity matrix
double **I = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) I[i] = malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
I[i][j] = 1;
}else{
I[i][j] = 0;
}
}
}
double f = 0.0;
double sub = 0.0;
for(int p=0; p<n; n++){
f = mat[p][p];
for(int x=0; x<n; x++){
mat[p][x] = mat[p][x] / f;
I[p][x] = I[p][x] / f; (line 45)
}
for(int i=p+1; i<n; i++){
f = mat[i][p]; (line 48)
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub; (line 51)
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub; (line 54)
}
}
}
for(int p=n-1; p>=0; p--){
for(int i=p-1; i>=0; i--){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
//return I;
printf("I:\n");
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("%f ",I[i][j]);
}
printf("\n");
}
//free
for (int i=0; i<n; i++) free(I[i]);
free(I);
}
void multiply(double *mat1[], double *mat2[], int R1, int C1, int R2, int C2, double *rslt[]) {
for (int i = 0; i < R1; i++) {
for (int j = 0; j < C2; j++) {
rslt[i][j] = 0;
for (int k = 0; k < R2; k++) {
rslt[i][j] += mat1[i][k] * mat2[k][j];
}
printf("%f\t", rslt[i][j]);
}
printf("\n");
}
//return rslt;
}
int main(){
double **rslt = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * (k+1));
multiply(x,t,n,k+1,k+1,n,rslt);
/* x and t are matrices, n=7, k+1=5,(these are the matrix dimensions for x, and the opposite are the matrix dimensions for t) */
/* the variables in the call to multiply(x and t are matrices, n and k+1 are
matrix dimensions, and rslt stores the result) are declared and cause no errors*/
/* the code works with no errors upto this point*/
/* rslt is the resulting matrix after the call to the multiply function
and n is the matrix dimensions */
inverse(rslt,n);
}
我正在尝试求两个矩阵相乘后的逆矩阵。该代码使用“rslt”矩阵来保存乘积并调用反函数。乘法函数完美运行,我只在调用“inverse()”后收到错误。
在 运行 valgrind 之后,它告诉我错误发生在反函数中。当我尝试访问矩阵时,它似乎在 for 循环中多次出现。它说泄漏在第 45、48、51 和 54 行(我指定了它们在上面的哪几行)。 valgrind 向我显示的具体错误是“大小 8 的无效读取”和“大小 8 的无效写入”。
当您将 R1xC1 矩阵乘以 R2xC2(其中 C1 必须等于 R2)时,您将得到一个 R1xC2 矩阵。
但是你没有为结果分配它。
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * (k+1))
multiply(x,t,n,k+1,k+1,n,rslt); ^^^^^
^ ^ wrong
R1 C2
所以这里
void multiply(double *mat1[], double *mat2[], int R1, int C1, int R2, int C2, double *rslt[]) {
for (int i = 0; i < R1; i++) {
for (int j = 0; j < C2; j++) {
rslt[i][j] = 0;
你在分配的内存之外写入(因为 n
比 k+1
大)。
你想做
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * n)
^
notice
我正在尝试创建一个矩阵计算器,但当我尝试使用反函数时,我收到一条错误消息“malloc():损坏的最大尺寸”。我不知道这个错误是什么意思以及如何解决它。
这是我的代码:
double** inverse(double *mat[], int n){
//identity matrix
double **I = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) I[i] = malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i==j){
I[i][j] = 1;
}else{
I[i][j] = 0;
}
}
}
double f = 0.0;
double sub = 0.0;
for(int p=0; p<n; n++){
f = mat[p][p];
for(int x=0; x<n; x++){
mat[p][x] = mat[p][x] / f;
I[p][x] = I[p][x] / f; (line 45)
}
for(int i=p+1; i<n; i++){
f = mat[i][p]; (line 48)
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub; (line 51)
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub; (line 54)
}
}
}
for(int p=n-1; p>=0; p--){
for(int i=p-1; i>=0; i--){
f = mat[i][p];
for(int x=0; x<n; x++){
sub = mat[p][x] * f;
mat[i][x] = mat[i][x] - sub;
sub = I[p][x] * f;
I[i][x] = I[i][x] - sub;
}
}
}
//return I;
printf("I:\n");
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
printf("%f ",I[i][j]);
}
printf("\n");
}
//free
for (int i=0; i<n; i++) free(I[i]);
free(I);
}
void multiply(double *mat1[], double *mat2[], int R1, int C1, int R2, int C2, double *rslt[]) {
for (int i = 0; i < R1; i++) {
for (int j = 0; j < C2; j++) {
rslt[i][j] = 0;
for (int k = 0; k < R2; k++) {
rslt[i][j] += mat1[i][k] * mat2[k][j];
}
printf("%f\t", rslt[i][j]);
}
printf("\n");
}
//return rslt;
}
int main(){
double **rslt = malloc(sizeof(double*) * n);
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * (k+1));
multiply(x,t,n,k+1,k+1,n,rslt);
/* x and t are matrices, n=7, k+1=5,(these are the matrix dimensions for x, and the opposite are the matrix dimensions for t) */
/* the variables in the call to multiply(x and t are matrices, n and k+1 are
matrix dimensions, and rslt stores the result) are declared and cause no errors*/
/* the code works with no errors upto this point*/
/* rslt is the resulting matrix after the call to the multiply function
and n is the matrix dimensions */
inverse(rslt,n);
}
我正在尝试求两个矩阵相乘后的逆矩阵。该代码使用“rslt”矩阵来保存乘积并调用反函数。乘法函数完美运行,我只在调用“inverse()”后收到错误。
在 运行 valgrind 之后,它告诉我错误发生在反函数中。当我尝试访问矩阵时,它似乎在 for 循环中多次出现。它说泄漏在第 45、48、51 和 54 行(我指定了它们在上面的哪几行)。 valgrind 向我显示的具体错误是“大小 8 的无效读取”和“大小 8 的无效写入”。
当您将 R1xC1 矩阵乘以 R2xC2(其中 C1 必须等于 R2)时,您将得到一个 R1xC2 矩阵。
但是你没有为结果分配它。
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * (k+1))
multiply(x,t,n,k+1,k+1,n,rslt); ^^^^^
^ ^ wrong
R1 C2
所以这里
void multiply(double *mat1[], double *mat2[], int R1, int C1, int R2, int C2, double *rslt[]) {
for (int i = 0; i < R1; i++) {
for (int j = 0; j < C2; j++) {
rslt[i][j] = 0;
你在分配的内存之外写入(因为 n
比 k+1
大)。
你想做
for (int i=0; i<n; i++) rslt[i] = malloc(sizeof(double) * n)
^
notice