Я использую clang-1000.11.45.5 на MacBook.Я пытаюсь создать структуру для динамически размещаемой 2D-матрицы.Это выглядит так:
typedef struct
{
int m_rows;
int m_cols;
double **arr;
double *data;
} t_mtrx;
t_mtrx *init_mtrx(int rows, int cols)
{
t_mtrx *A = malloc(sizeof(t_mtrx));
A -> m_rows = rows;
A -> m_cols = cols;
A -> arr = malloc(rows * sizeof(*A->arr));
A -> data = malloc(rows * cols * sizeof(*A->data));
for(int i = 0; i < rows; i++, A -> data += cols)
A -> arr[i] = A -> data;
return A;
}
void del_mtrx(t_mtrx *A)
{
free(A->data);
free(A->arr);
}
В основном в каждой матрице есть два указателя:
*data
: все элементы в матрице расположены в одномерном массиве
**arr
: указатели на адрес первого элемента каждого столбца
С этим все работало нормально, кроме создания деконструктора.
int main()
{
int rows = 3;
int cols = 3;
double ra[] = {1, 3223, 5},
rb[] = {2, 0, -99},
rc[] = {14, 134, 130};
t_mtrx A = *init_mtrx(rows, cols);
A.arr[0] = ra;
A.arr[1] = rb;
A.arr[2] = rc;
print_mtrx(&A);
del_mtrx(&A);
}
Когда я запускаю это, все работает, кроме del_mtrx
.
$ ./a.out
[[ 1.00, 3223.00, 5.00],
[ 2.00, 0.00, -99.00],
[ 14.00, 134.00, 130.00]] 3 x 3
a.out(684,0x10533e5c0) malloc: *** error for object 0x7fea65c02a48: pointer being freed was not allocated
a.out(684,0x10533e5c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Я знаю, что проблема с free(A -> data);
, потому что, когда я комментирую это, нетошибка, но я не уверен, как еще ее освободить.