在双精度数组的calloc上大小8的无效写入

问题描述 投票:-1回答:1

我不想在这里问,但我几乎没有其他选择。

我具有矩阵结构

#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显然是问题所在,但我找不到我做错了什么。有人有主意吗?

c++ valgrind calloc
1个回答
0
投票

calloc在当前函数的stack中分配内存。如果在函数返回后保留指向该内存的指针,则该指针是悬空的。只要随后的函数调用不触及堆栈存储器,它将继续工作。

malloc(或者更好的是,new double[rows*columns])分配内存将在堆上分配它。这确实意味着您的Matrix结构在销毁时将必须释放内存,请参见rule of three/five

© www.soinside.com 2019 - 2024. All rights reserved.