未初始化的值由堆栈分配矩阵mult创建

时间:2018-05-07 10:59:41

标签: c valgrind

我有这个函数用于矩阵乘法,标准三重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)

1 个答案:

答案 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是打算调用但是没有输入循环,这很奇怪(?!)。