我有这段可演示的代码:
#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)
std::vector<int>
是最合适的选择。无需重新分配内存,不必麻烦。 - Dialecticusrealloc
函数的功能取决于第一个参数的值。在您的情况下,它必须为 NULL,否则会导致崩溃。 - Šimon Tóth(指向(malloc分配的int型指针数组的指针)的指针)
; 所以你应该用NULL填充它们;但是,采纳@Dialecticus的建议,使用vector可以省去一些麻烦。 - Lie Ryan