Неинициализированное значение было создано множеством матриц распределения стека - PullRequest
0 голосов
/ 07 мая 2018

У меня есть эта функция для умножения матриц, стандартный тройной цикл 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)

1 Ответ

0 голосов
/ 07 мая 2018

В приведенном выше фрагменте кода есть несколько проблем.

  • 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 (до ввода цикла) теряется, если только данные в структуре таковы, чтофункция matrix_mult предназначена для вызова, но цикл не вводится, что было бы странно (?!).

...