如何在C中正确释放char **表

我需要你对这段代码的建议:表字段选项[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个字节或在64位计算机上为8个字节),因此sizeof(options)/sizeof(options[0])几乎总是1。

关键是始终以与malloc编辑它相同的方式free内存。 因此,如果你使用二维数组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)不是常量,则需要自己跟踪它,否则您无法知道在释放时循环多少次。

你应该拥有与malloc相同数量的free s。

在您的代码中,您分配了指针数组,但是您没有为要指向的数组的各个元素分配任何内存。 但是你的解放代码就像你写的一样。

我将在这里添加Adam的答案,因为这可能不适合评论。 亚当完全正确。 我怀疑你的generate_fields函数,但是,实际上可能从用户获得输入,我不确定。 无论如何,有两种方法可以解决这个问题:

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

以及相应的自由function,为简洁起见,我将省略。 你可以看到发生了什么 - 我们传递的是字段数和字段大小。 根据需要改变它。 另一种选择是将生成字段传递回从数组大小调用的例程。 我会做这样的事情:

 int generate_fields(char** options) { int num_fields = 0; // somewhere here we get num_fields options = malloc(num_fields*sizeof(char *)); for(int i = 0; i < num_fields; i++) options[i] = malloc(size_of_field); return num_fields; } 

你从主要电话这样打电话:

 int main() { int sizeofarray = 0; char** fields; sizeofarray = generate_fields(fields); 

或者,如果你不喜欢这种符号,你可以随时坚持你所拥有的:

 char** generate_fields(int* size) 

作为函数原型(这次返回选项,并在代码中的某个地方执行size=并从main调用,如下所示:

 int sizeofarray = 0; char** options; options = generate_fields(&sizeofarray); 

希望能给你一些更多的想法,亚当,你可以随意将你的任何/所有这些想法编辑到你的答案中,无论如何它来自你的答案。