gpt4 book ai didi

C: free() invalid next size (fast) 错误。(CodeBlocks, GCC)

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:27 26 4
gpt4 key购买 nike

我的任务是从一个文件中读取一个大小为 m*n 的矩阵,然后将它与从另一个文件中读取的长度为 n 的 vector 相乘(这些文件只包含制表符和“输入”(我不'知道行尾的英文名称。(它从命令行参数获取文件名)

我用 C 编写了一个代码,它执行乘法运算,但在运行结束时,如果我在调试中编译,我会收到错误“C: free() invalid next size (fast) error”,如果我在发行版中编译,则会出现段错误。我对调试不是很熟悉,所以我不知道如何找到这个错误。如果你能帮助我,那将非常有帮助。我已经阅读了许多关于此错误的其他问题,但没有找到适合我的解决方案。

(即使对于矩阵结构,我也只能使用 double* 而不能使用 double** ,因为在进一步的任务中我必须使用 LAPACK,并且它更喜欢这种格式。)

我的代码是:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct matrix{
int rows;
int cols;
double* matrix;
}Mat;

Mat Read(char* f){
Mat mat;
int i = 0;
int n = 1;
int m = 1;
char tmp;

mat.matrix = (double*)malloc(n * sizeof(double));
FILE* file = fopen(f, "r");
while(fscanf(file,"%lf",&mat.matrix[i]) >=1){
i++;
if(i == n){
n *= 2;
mat.matrix = (double*)realloc(mat.matrix, n * sizeof(double));
}
tmp = fgetc(file);
if(tmp != '\n' && tmp != EOF){
m++;
}else{
mat.cols = m;
m = 1;
}
}

mat.rows = i/mat.cols;
fclose(file);
return mat;
}

Mat Multipmatvec(Mat mat, Mat vec){
int i, j;
Mat ans;
ans.matrix = (double*)malloc(sizeof(double) * vec.cols);

for(i = 0; i < mat.rows; i++){
ans.matrix[i] = 0;
for(j = 0; j < mat.cols; j++){
ans.matrix[i] += mat.matrix[i*mat.cols+j] * vec.matrix[j];
}
}
return ans;
}

void print(Mat mat){
int i,j;
if(mat.cols==1){
for(i = 0; i < mat.rows; i++){
printf("%lf\n", mat.matrix[i]);
}
}else if(mat.rows == 1){
for(i = 0; i < mat.cols; i++){
printf("%lf\n", mat.matrix[i]);
}
}else{
for(i = 0; i < mat.rows*mat.cols; i++){
if(i%mat.cols==0 && i!=0){
printf("\n");
}
printf("%lf\t", mat.matrix[i]);
}
}
}


int main(int argc, char** argv){
Mat vec;
Mat ans;
Mat mat;

vec = Read(argv[2]);
mat = Read(argv[1]);

if (mat.cols % vec.cols != 0){
printf("Matrix Size Error.\n");
return 1;
}
printf("Mat: \n");
print(mat);
printf("\nVec: \n");
print(vec);


ans.matrix = (double*)malloc(sizeof(double*)*vec.cols);
ans = Multipmatvec(mat, vec);
ans.cols = mat.rows;
ans.rows = 1;


printf("\nResult:\n");
print(ans);


free(vec.matrix);
free(ans.matrix);
free(mat.matrix);

return 0;
}

最佳答案

我过度索引了 ans.matrix 结构元素。 ans.cols 值为 1,循环运行到 mat.rows,它至少为 1,但通常更多。

更正后的版本是这样的(如果我用代码块在 Release模式下编译它仍然会出现段错误,但是如果我从终端用 gcc 编译它就没有任何问题。):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct matrix{
int rows;
int cols;
double* matrix;
}Mat;

Mat Read(char* f){
Mat mat;
int i = 0;
int n = 1;
int m = 1;
char tmp;

mat.matrix = (double*)malloc(n * sizeof(double));
FILE* file = fopen(f, "r");
while(fscanf(file,"%lf",&mat.matrix[i]) >=1){
i++;
if(i == n){
n *= 2;
mat.matrix = (double*)realloc(mat.matrix, n * sizeof(double));
}
tmp = fgetc(file);
if(tmp != '\n' && tmp != EOF){
m++;
}else{
mat.cols = m;
m = 1;
}
}
mat.rows = i/mat.cols;
fclose(file);
return mat;
}

Mat Multipmatvec(Mat mat, Mat vec){
int i, j;
Mat ans;
ans.matrix = (double*)malloc(sizeof(double) * mat.rows);
for(i = 0; i < mat.rows; i++){
ans.matrix[i] = 0;
for(j = 0; j < mat.cols; j++){
ans.matrix[i] += mat.matrix[i*mat.cols+j] * vec.matrix[j];
}
}
return ans;
}

void print(Mat mat){
int i;
if(mat.cols==1){
for(i = 0; i < mat.rows; i++){
printf("%lf\n", mat.matrix[i]);
}
}else if(mat.rows == 1){
for(i = 0; i < mat.cols; i++){
printf("%lf\n", mat.matrix[i]);
}
}else{
for(i = 0; i < mat.rows*mat.cols; i++){
if(i%mat.cols==0 && i!=0){
printf("\n");
}
printf("%lf\t", mat.matrix[i]);
}
}
}


int main(int argc, char** argv){
Mat vec;
Mat ans;
Mat mat;

vec = Read(argv[2]);
mat = Read(argv[1]);

if (mat.cols % vec.cols != 0){
printf("Matrix Size Error.\n");
return 1;
}
printf("Mat: \n");
print(mat);
printf("\nVec: \n");
print(vec);

ans.matrix = (double*)malloc(sizeof(double*)*vec.cols);
ans = Multipmatvec(mat, vec);
ans.cols = mat.rows;
ans.rows = 1;


printf("\nResult:\n");
print(ans);

free(vec.matrix);
free(ans.matrix);
free(mat.matrix);

return 0;
}

关于C: free() invalid next size (fast) 错误。(CodeBlocks, GCC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30163057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com