Free()一个部分释放的字符串数组C.

时间:2014-03-12 18:02:09

标签: c arrays string free

假设我有一个字符串数组,其中一些已经是免费的,例如:

char **array;
array = malloc(20*sizeof(char*));

for(i=0;i<arr_size;i++)
{
    array[i]='\0';
    free(array[i]);
}
free(array);

这是一种正确的方法吗?因为我似乎仍然有一些内存泄漏, 在我的例子中是一个包含20个字符串的数组,其中9个已经被释放。

我想问题是如何解放自由&#34;释放&#34;字符串。 谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

  

我想问题是如何释放“释放”字符串。

嗯,你没有。您必须freemalloc个'字符串恰好一次。在同一个字符串上多次调用free将导致未定义的行为。

除此之外,您的问题如下:

array[i]='\0';

在这里,您在free之前覆盖指针的值。

答案 1 :(得分:1)

按照惯例,您应该始终在NULL之后设置指向free的指针。然后你应该检查指针是否是NULL,如果没有,那么你可以free。这样你就可以跟踪哪些是free - ed,哪些没有。

答案 2 :(得分:0)

1 malloc()分配只需要1 free()来释放内存。所以free(array);足以释放内存。

free()释放内存与使用malloc()动态分配的内存相反。

答案 3 :(得分:0)

使用free(array [i]);当您尝试释放其值(指针)在前一行上已更改的指针时,将导致出现问题/奇怪错误。

代码     阵列[I] =&#39; \ 0&#39 ;;

可能没有所需的结果,因为它设置指针值而不是字符内容。也许是sprintf(array [i],&#34; \ 0&#34;);会更好

char **array=NULL;  //(Helps you to give it an initial value pointing to NULL)

array = malloc(arr_size+1);  

if (!array[i])
{
// array == NULL which is not right after malloc
// there has been an error with malloc, trap and exit somehow
}
else
{
// Use array as you wish as it has been allocated, take care not to 
// run past the end of the array length
}

if (array[i]) free(array[i]);   // checks that it is not NULL anymore, as NULL does not need freeing.

您可以将IF语句扩展为:(表示与上面相同,但包括强制释放的变量为NULL)

if (array[i]!=NULL) 
{
 free(array[i]);   
 array[i] = NULL;
}