gpt4 book ai didi

c - 如何在 C 中正确释放一个 char **表

转载 作者:太空狗 更新时间:2023-10-29 17:14:42 26 4
gpt4 key购买 nike

我需要你对这段代码的建议:表字段选项[0]、选项[1] 等...似乎没有被正确释放。感谢您的回答

int main()
{
....
char **options;
options = generate_fields(user_input);
for(i = 0; i < sizeof(options) / sizeof(options[0]); i++) {
free(options[i]);
options[i] = NULL;
}

free(options);
}

char ** generate_fields(char *)
{
char ** options = malloc(256*sizeof(char *));
...
return options;

}

最佳答案

问题是这样的:

for(i = 0; i < sizeof(options) / sizeof(options[0]); i++)

options 是指针类型,而不是数组类型,因此 sizeof(options) 将始终相同(在 32 位机器上通常为 4 个字节或 8 个字节) 64 位机器上的字节数),所以 sizeof(options)/sizeof(options[0]) 几乎总是 1。

关键是总是释放 内存,就像您malloc 一样。因此,如果您 malloc 一个二维数组,然后 malloc 一系列一维数组,您需要在释放它时执行相反的操作:

char ** generate_fields(char *) 
{
char ** options = malloc(256*sizeof(char *));
for(int i = 0; i < 256; i++)
options[i] = malloc(some_size);
return options;
}

void free_fields(char ** options)
{
for(int i = 0; i < 256; i++)
free(options[i]);
free(options);
}

请注意,如果大小(在本例中为 256)不是常量,您需要自己跟踪它,否则您无法知道释放时要循环多少次。

关于c - 如何在 C 中正确释放一个 char **表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2483869/

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