【发布时间】:2021-03-29 14:05:54
【问题描述】:
我开始学习动态内存分配。在这段代码中,我在 main 函数中创建了二维数组:
int r, c;
scanf("%d %d\n", &r, &c);
size_t row = (size_t) r;
size_t col = (size_t) c;
int **board = malloc(row * sizeof(*board));
for (int i = 0; i < r; i++) {
board[i] = malloc(col * sizeof(*board[i]));
}
(由于 for 循环,我需要 int 和 size_t,尤其是当 r>=0 时,这对于 size_t 总是如此)。
然后我将板子换成其他功能。 Valgrind 回归:
==59075== 364 (56 direct, 308 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==59075== at 0x483577F: malloc (vg_replace_malloc.c:299)
==59075== by 0x10B4DB: main (name22.c:122)
==59075==
122 行是:
int **board = malloc(row*sizeof( *board));
我想我必须使用 free(),但是在检查了其他我不知道的答案之后,我的错误在哪里以及将 free() 放在哪里,如果在程序的其余部分使用此表。我会很感激你的提示和解释。 `
【问题讨论】:
-
如果你改变了
board的地址,那么创建的内存现在是孤立的。提供足够多的代码来说明问题,至少一个minimal reproducible example -
如果你一直使用内存块直到你的程序结束,那么你应该调用
free作为你在函数main中做的最后一件事。在调用free之后,任何情况下都不能访问内存块,否则你的程序会导致undefined behavior。另外,请记住不要只调用一次free,而是每次调用malloc一次。所以你也必须循环调用它,就像你对malloc所做的那样。
标签: c multidimensional-array malloc dynamic-memory-allocation