我有这个函数用于矩阵乘法,标准三重for循环。 输入是指向两个结构的指针(显示在函数下面)。函数的名称在第125行(第126行是{)。它输出正确的数字,在多个输入上测试。但是valgrind并不喜欢它。
pip3 install 'pandas<0.21'
而matrix_t就是这个结构:
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;
}
valgrind输出是:
struct matrix
{
int height;
int width;
int** array;
};
同样的:
==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)
答案 0 :(得分:0)
上面的代码段中存在多个问题。
for (int i; i < (matrix_1 -> height); ++i)
这里i
未初始化,因为i
将包含随机(垃圾)值。这样,可以输入或不输入循环。calloc
的调用会成功。需要进行错误检查。检查calloc
是否返回NULL,如果是,则处理错误。冗余代码。
mult = calloc(matrix_1 -> height, sizeof(int*));
for (int i; i < (matrix_1 -> height); ++i)`
{
mult[i] = calloc(matrix_2 -> width, sizeof(int));
// some code
}
使用未启动的i
解决问题后,第一次调用calloc
(在输入循环之前)被浪费,除非struct中的数据是函数matrix_mult
是打算调用但是没有输入循环,这很奇怪(?!)。