我得到了以下代码
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]);
}
}
够了吗?
最佳答案
您必须取消分配您分配的所有内容。
你最多可以通过这样写来保存一个循环:
for(int row = 0; row < rows; row++) {
for(int col = 0; col < cols; col++) {
free(data[row][col]);
}
free(data[row]);
}
free(data);
如果你想一次性取消分配,你必须一次性分配,但是对于指针数组来说这很棘手,必须用红色闪烁字体注释:
data = malloc(rows * (1 + cols) * sizeof(void *));
for (i=0; i<rows; i++) {
data[i] = &(data[cols * i]);
}
取消分配将是:
for(int row = 0; row < rows; row++) {
for(int col = 0; col < cols; col++) {
free(data[row][col]);
}
}
free(data);
如果你愿意,你可以直接分配一个二维数组:
data = malloc(rows * cols * sizeof(void *));
但是,您必须通过 data[j + i * rows]
访问各个元素...以红色闪烁字体进行注释...
关于c - 如何在 C 中正确释放 char*** 内存,这样我就不会发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25032863/