【发布时间】:2014-07-30 09:10:18
【问题描述】:
我得到以下代码
int rows = 123;
int cols = 12;
char ***data = (char ***)malloc(rows * sizeof(char **));
if(data) {
for(int i = 0; i < num_rows; i++)
{
data[i] = (char **)malloc(cols * sizeof(char *));
if(!data[i])
{
for(int j = 0; j < i; j++)
free(data[j]);
free(data);
printf("no memory\n");
return -1;
}
}
}
char randomData[] = "<Inserts random string here everytime>";
for(int row = 0; row < rows; row++) {
for(int col = 0; col < cols; col++) {
data[row][col] = (char *) malloc(sizeof(char) * (1 + strlen(randomData)));
strcpy(data[row][col], randomData);
}
}
我为此 stackoverflow 编写了这个示例,因为实际代码相似,但 <Inserts random string here everytime> 是从每个 SQL 行和每个列输出的。
我只想做一个像data[row][column]这样的多维数组
完成后如何正确释放它?
我想清除它,我必须先清除第一颗星。 char *
for(int row = 0; row < rows; row++) {
for(int col = 0; col < cols; col++) {
free(data[row][col]);
}
}
然后清理第二颗星char **
for(int row = 0; row < rows; row++) {
free(data[row]);
}
那我终于可以清除最后的三颗星了char ***
free(data);
这是你的做法吗?似乎是一个矫枉过正太多免费的..是
for(int row = 0; row < rows; row++) {
for(int col = 0; col < cols; col++) {
free(data[row][col]);
}
}
够了吗?
【问题讨论】:
-
“免费的似乎有点过头了..”,好吧,你有这么多
mallocs!每个malloc都需要一个free语句。这包括循环内的每一次出现;所以,“是的”。 -
@Jongware 这是否意味着我需要
free(data[row][col]);和free(data[row]);我已经知道最后我需要free(data);。有些东西告诉我data[row][col]似乎可以同时两个 2。再一次,是的,似乎真的data[row][col]只会清除实际的字符串本身,而不是矩阵本身。我怎么知道我必须做 data[row] 还是 data[col]?因为我的意思是这些只是数字行/列。 -
绝对。你malloc 他们,所以你也需要free 他们。它尽可能简单。
-
所以我运行 1 个 malloc,然后 123 个 malloc,然后谁知道 15129 个 malloc 有多少,哈哈。我知道我肯定会错过一些东西。
-
.. 上面说了,你可能想到了
malloc (rows * cols * sizeof(char *))。这将将行和列都放在一个连续的内存块中。如果行数和列数是静态的,您可以考虑这一点——但您需要“手动”计算行/列索引。
标签: c memory-management memory-leaks