mat->data = (int**)malloc(sizeof(m) * (m * n));
эта строка не делает то, что вы думаете. Вам нужно сначала выделить c пробел для указателей, а затем пробел для ссылочных объектов для всех выделенных указателей.
важно !!! Вам всегда нужно проверять результат работы mallo c!
, он должен быть:
if(mat->data = malloc(sizeof(*mat->data) * (m)))
{
for(size_t index = 0; index < n; index++)
{
if(!(mat->data[index] = malloc(sizeof(**mat->data) * n)))
{
//do something if malloc failed
}
}
}
https://godbolt.org/z/skBJzb
Лично Я бы не стал так поступать в этом случае. Я предпочитаю лично ограничить количество malloc
struct matrix {
size_t r, c; // r rows, c columns
char name[64];
int data[];
};
struct matrix* alloc_matrix(const char* name, size_t rows, size_t cols) {
struct matrix *mat = malloc(sizeof(*mat) + rows * cols * sizeof(mat -> data[0]));
if(mat)
{
strcpy(mat->name, name);
mat->r = rows;
mat->c = cols;
}
return mat;
}
int setdata(struct matrix *mat, size_t row, size_t col, int val)
{
int result = -1;
if(mat)
{
if(row < mat -> r && col < mat -> c)
{
mat -> data[row * mat -> c + col] = val;
result = 0;
}
}
return result;
}
int main() {
struct matrix* mat1 = alloc_matrix("mat1", 4, 4);
if(mat1)
{
printf("set result %d\n", setdata(mat1, 2, 2, 0));
printf("set result %d\n", setdata(mat1, 5, 2, 0));
}
}