C语言中的可用内存(无法修复内存泄漏)

C语言中的可用内存(无法修复内存泄漏),c,arrays,memory,pointers,malloc,C,Arrays,Memory,Pointers,Malloc,编辑:我已经根据人们的建议更改了我的程序,但我无法修复内存泄漏。另外,我需要在不使用argc的情况下释放它们,因此我需要以某种方式跟踪数组长度,以便将最后一个元素标记为null 目前我正在编写一个C程序,它将命令行参数复制到一个动态分配的数组中。我的代码如下所示: char **array;

编辑:我已经根据人们的建议更改了我的程序,但我无法修复内存泄漏。另外,我需要在不使用argc的情况下释放它们,因此我需要以某种方式跟踪数组长度,以便将最后一个元素标记为null

目前我正在编写一个C程序,它将命令行参数复制到一个动态分配的数组中。我的代码如下所示:

char **array;                                                                                                                                                                                     
int j;                                                                                                                                                                                        

array = malloc(sizeof(char*) * (argc + 1));                                                                                                                                                       
int i;                                                                                                                                                                                            
int index = 0;                                                                                                                                                                                    

for(i = 0; i < (argc); i++){                                                                                                                                                                      
    int length = strlen(*(argv + i));                                                                                                                                                             
    array[i] = malloc((length + 1) * sizeof(char));                                                                                                                                                                                                                                                                                                                                    
        // Cycle through all the chars and copy them in one by one                                                                                                                                
    for(j = 0; j <= length; j++){                                                                                                                                                                 
        array[i][j] = toupper(argv[i][j]);                                                                                                                                                        
    }                                                                                                                                                                                             
}      
array[i + 1] = NULL;                                                                                                                                                                                           

return array;      
然而,我仍然有内存泄漏。我不太确定我做错了什么。如果有人能给我一些建议那就太好了

谢谢!

您的最后一行
free(array)
并没有释放原始malloc,因为在释放其内容时,您增加了
array

此外(正如其他人指出的):

  • 释放数组内容的循环正在检查是否为非零,但不能确保元素一开始为零

  • 当您只需要argc时,可以在数组中分配argc+1元素

  • *(argv+i)
    argv[i]
    相同


阵列
从一开始就被完全关闭了。
free(数组)
正在损坏堆,而不是释放

然后将循环更改为

while(*array_iter){
    free(*array_iter++);
}
free(array);

你的while循环不工作。首先只为
char*
分配
argc
时间空间。然后为每个字符串分配
strlen+1
(空终止符),然后使用
strcpy
复制字符串并随后将其大写(不太容易出错)。然后,有一个
free
这样的:

for(int i = 0; i < argc; ++i) free(array[i]);
for(int i=0;i
通过使用post增量,您将指针设置为与原来不同的值。您不再释放正确的内存。

为什么要为数组使用malloc
argc+1
?您只需要
argc
次。当循环中断时,删除
。始终计算数组大小。我已根据您(和其他人)的建议更改了代码,但仍在泄漏内存。我使用argc+1的原因是添加一个null元素来跟踪数组结束,因为对于赋值,我不允许使用带有argc的循环作为计数器。很抱歉造成混淆,我已经编辑了我的帖子以符合我当前的代码。
while(*array_iter){
    free(*array_iter++);
}
free(array);
for(int i = 0; i < argc; ++i) free(array[i]);