gpt4 book ai didi

c - 如何在 C 中正确释放 char*** 内存,这样我就不会发生内存泄漏

转载 作者:行者123 更新时间:2023-12-02 08:32:47 29 4
gpt4 key购买 nike

我得到了以下代码

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com