Я не знаю, почему valgrind будет жаловаться на это утверждение free
, но, похоже, происходит много манипуляций с указателями, поэтому меня не удивляет, что вы впервые столкнулись с этой проблемой.Например, одна вещь, которая попалась на глаза, это:
array2 = array-rows_start;
Это сделает массив2 [0] разыменовываемой памятью, которую вы не выделяли.Боюсь, это просто вопрос времени, пока вы не ошибетесь в вычислениях смещений и не столкнетесь с этой проблемой.
Один комментарий, который вы написали
, но в моей программе мне нужно многоэти массивы со всеми различными начальными индексами, поэтому я надеюсь найти более элегантное решение вместо определения двух смещений для каждого массива.
Я думаю, что я скрыл бы все это в вспомогательной структуре matrix
(+ функции), чтобы вам не приходилось загромождать код всеми смещениями.Учтите это в каком-то заголовке matrix.h
:
struct matrix; /* opaque type */
/* Allocates a matrix with the given dimensions, sample invocation might be:
*
* struct matrix *m;
* matrix_alloc( &m, -2, 14, -9, 33 );
*/
void matrix_alloc( struct matrix **m, int minRow, int maxRow, int minCol, int maxCol );
/* Releases resources allocated by the given matrix, e.g.:
*
* struct matrix *m;
* ...
* matrix_free( m );
*/
void matrix_free( struct matrix *m );
/* Get/Set the value of some elment in the matrix; takes logicaly (potentially negative)
* coordinates and translates them to zero-based coordinates internally, e.g.:
*
* struct matrix *m;
* ...
* int val = matrix_get( m, 9, -7 );
*/
int matrix_get( struct matrix *m, int row, int col );
void matrix_set( struct matrix *m, int row, int col, int val );
А вот как может выглядеть реализация (это будет matrix.c
):
struct matrix {
int minRow, maxRow, minCol, maxCol;
int **elem;
};
void matrix_alloc( struct matrix **m, int minCol, int maxCol, int minRow, int maxRow ) {
int numRows = maxRow - minRow;
int numCols = maxCol - minCol;
*m = malloc( sizeof( struct matrix ) );
*elem = malloc( numRows * sizeof( *elem ) );
for ( int i = 0; i < numRows; ++i )
*elem = malloc( numCols * sizeof( int ) );
/* setting other fields of the matrix omitted for brevity */
}
void matrix_free( struct matrix *m ) {
/* omitted for brevity */
}
int matrix_get( struct matrix *m, int col, int row ) {
return m->elem[row - m->minRow][col - m->minCol];
}
void matrix_set( struct matrix *m, int col, int row, int val ) {
m->elem[row - m->minRow][col - m->minCol] = val;
}
Таким образом, вам нужно толькоПолучите этот материал сразу, в центральном месте.Остальная часть вашей программы имеет дело не с необработанными массивами, а с типом struct matrix
.