Эта функция
Matrix* newMatrix(const unsigned int rowsNo, const unsigned int columnsNo) {
assert(rowsNo > 0 && columnsNo > 0);
Matrix new = {
.grid = malloc(rowsNo * columnsNo * sizeof(int)),
.rowsNo = rowsNo,
.columnsNo = columnsNo
};
Matrix* self = &new;
return self;
}
является причиной неопределенного поведения, поскольку функция возвращает указатель на локальный объект new
с автоматическим c сроком хранения
Matrix* self = &new;
return self;
, который не будет живым после выхода из функции. Таким образом, возвращаемый указатель имеет недопустимое значение, которое не указывает на действительный объект.
На самом деле нет смысла возвращать из функции указатель. Вы можете просто вернуть созданный объект. Также элемент данных grid
должен иметь нулевую инициализацию.
Функция может выглядеть следующим образом
Matrix newMatrix(const unsigned int rowsNo, const unsigned int columnsNo) {
assert(rowsNo > 0 && columnsNo > 0);
Matrix m = {
.grid = calloc( rowsNo * columnsNo, sizeof(int) ),
.rowsNo = rowsNo,
.columnsNo = columnsNo
};
return m;
}
А в вызывающей программе вы можете написать
Matrix m = newMatrix( rowsNo, columnsNo );
Функции getElementAt
и setElementAt
имеют ошибку.
Вместо выражения
row * self->rowsNo + column
Вы должны использовать
row * self->columnsNo + column
Также вам нужно написать функцию, которая освободит выделенную память для элемента данных grid
.