У меня есть наглядный фрагмент кода:

#include <cstdlib>
#include <cstdio>

int main() {
    int ** matrix = NULL;
    int c = 1, input = 0;

    printf("Enter first row of the matrix:\n");
    while (!feof(stdin)) {
        input = fgetc(stdin);

        matrix = (int**) realloc(matrix, 1 * sizeof (int*));
        if (matrix == NULL) {
            printf("Troubles with memory allocation!\n");
            return 0;
        }
        matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));
        matrix[0][c-1] = (int) input;

        c++;
    }

    free(matrix[0]);
    free(matrix);

    return 0;
}

Это вызывает ошибку в Valgrind, но я действительно не знаю, что это значит и как это исправить ... может ли кто-нибудь дать мне совет?

==30031== 1 errors in context 1 of 1:
==30031== Conditional jump or move depends on uninitialised value(s)
==30031==    at 0x402868B: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x80485CB: main (main.cpp:17)
==30031==  Uninitialised value was created by a heap allocation
==30031==    at 0x402860A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x4028694: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x80485A6: main (main.cpp:12)
6
Radek Simko 22 Ноя 2010 в 00:21
1
Вы не инициализировали матрицу [0] перед вторым вызовом перераспределения. Его можно было заполнить чем угодно.
 – 
wj32
22 Ноя 2010 в 00:25
6
Кстати, подумайте об использовании контейнеров STL, std::vector<int> - наиболее логичный выбор. Никакого перераспределения, никаких хлопот.
 – 
Dialecticus
22 Ноя 2010 в 00:29
Если это двумерный массив, каким значением его следует заполнить?
 – 
Radek Simko
22 Ноя 2010 в 00:29
Функциональность realloc зависит от значения первого параметра. В вашем случае он должен быть NULL, иначе произойдет сбой.
 – 
Šimon Tóth
22 Ноя 2010 в 00:34
1
Ваш двумерный массив на самом деле (pointer to (malloc-ated array of (pointer to an (malloc-ated array of int)))); поэтому вы должны заполнить их значениями NULL; однако прислушайтесь к совету @Diallecticus и избавьтесь от некоторых проблем, используя вектор
 – 
Lie Ryan
22 Ноя 2010 в 00:36

3 ответа

Лучший ответ

matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));

Вы передаете matrix[0] в качестве параметра без его предварительной инициализации.

6
Šimon Tóth 22 Ноя 2010 в 00:28

Вы можете использовать более мощную утилиту. BoundsChecker, Deleaker, XWatcher ...

2
John Smith 2 Дек 2011 в 20:58
1
Ваша ссылка не работает
 – 
z0r1fan
1 Окт 2018 в 21:48

Советую использовать deleaker - мощный инструмент для устранения утечек памяти!

2
Richard J. Ross III 13 Дек 2011 в 23:45
4
Я для вас добавил ссылку на программу, добро пожаловать на сайт z0r1fan!
 – 
Richard J. Ross III
13 Дек 2011 в 23:45