У меня есть эта функция для умножения матриц, стандартный тройной цикл for.
Входные данные являются указателями на две структуры (показано под функцией). Название функции в строке 125 (строка 126 - {). Он выводит правильные числа, проверенные на нескольких входах. Однако Вальгринду это не нравится.
void matrix_mult(matrix_t* matrix_1, matrix_t* matrix_2)
{
int** mult;
mult = calloc(matrix_1 -> height, sizeof(int*));
for (int i; i < (matrix_1 -> height); ++i)
{
mult[i] = calloc(matrix_2 -> width, sizeof(int));
for (int j = 0; j < (matrix_2 -> width); ++j)
{
for (int k = 0; k < (matrix_1 -> width); ++k)
{
mult[i][j] += (matrix_1 -> array[i][k]) * (matrix_2 -> array[k][j]);
}
}
free(matrix_1 -> array[i]);
}
free(matrix_1 -> array);
matrix_1 -> array = mult;
matrix_1 -> width = matrix_2 -> width;
}
И matrix_t это структура:
struct matrix
{
int height;
int width;
int** array;
};
Выход Valgrind:
==837== Conditional jump or move depends on uninitialised value(s)
==837== at 0x400ED5: matrix_mult (main.c:129)
==837== by 0x400F84: main (main.c:153)
==837== Uninitialised value was created by a stack allocation
==837== at 0x400D6C: matrix_mult (main.c:126)
то же самое для:
matrix_mult (main.c:131)
matrix_mult (main.c:131)
matrix_mult (main.c:136)
matrix_mult (main.c:139)