我不想在这里问,但我几乎没有其他选择。
我具有矩阵结构
#include <stdlib.h>
#include <math.h>
typedef struct Matrix{
double *mat;
int rows;
int columns;
} Matrix;
我这样初始化
Matrix* init_Matrix(int rows, int columns) {
Matrix *matrix = (Matrix*) malloc(sizeof(Matrix));
matrix->rows = rows;
matrix->columns = columns;
matrix->mat = (double*) calloc(rows*columns, sizeof(double));
return matrix;
}
但是,当我将它作为较大代码的一部分运行时,它最终给出了结果
malloc(): corrupted top size
Aborted (core dumped)
错误不是系统性的,而是在代码的第二次初始化时发生。这促使我用valgrind
对其进行测试,从而得到以下输出
==19211== Invalid write of size 8
==19211== at 0x1096DF: odometer(Robot*, double, double, double) (main.cc:41)
==19211== by 0x109B6F: main (main.cc:82)
==19211== Address 0x4dcbe68 is 0 bytes after a block of size 72 alloc'd
==19211== at 0x483CD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==19211== by 0x109C33: init_Matrix(int, int) (matrix_gr7.cc:18)
==19211== by 0x1095BD: odometer(Robot*, double, double, double) (main.cc:38)
==19211== by 0x109B6F: main (main.cc:82)
calloc
显然是问题所在,但我找不到我做错了什么。有人有主意吗?
calloc
在当前函数的stack中分配内存。如果在函数返回后保留指向该内存的指针,则该指针是悬空的。只要随后的函数调用不触及堆栈存储器,它将继续工作。
用malloc
(或者更好的是,new double[rows*columns]
)分配内存将在堆上分配它。这确实意味着您的Matrix
结构在销毁时将必须释放内存,请参见rule of three/five。