我有一个内存分配问题。如果我在char*
块中声明else
,则意味着char*
块在执行完else
块时被销毁。 else
块位于while
循环中,因此它将迭代多次。但是,如果char*
块中声明的else
别名为malloc'd
变量,如下例所示,该怎么办?我的问题是我如何收取这样的费用?我觉得如果我释放临时char*
变量,我将导致分段错误,因为我将释放我想要保留的变量。如果是这种情况,我对free
陈述所在的地方感到茫然。
char* print_path = NULL;
(剪断)
(while)
else{
char* temp_path = print_path;
int temp_size = strlen(temp_path)+strlen(file_name(child->fts_path))+1;
print_path = (char*)malloc(temp_size);
strcpy(print_path, temp_path);
strncat(print_path, file_name(child->fts_path), strlen(file_name(child->fts_path)));
printf("%s:\n\n", print_path);
}
(剪断)
我想指出,在我知道它不会再次执行之后,我会在程序结束时释放print_path。但是,这是我想要释放的循环的中间执行。任何帮助,将不胜感激。 谢谢!
答案 0 :(得分:2)
看起来free(temp_path)
是正确的。它应该是这样的:
char * print_path = malloc(...); // "NULL" is also possible
while (condition)
{
if (...)
{
// ...
}
else
{
char * temp_path = print_path;
print_path = malloc(...);
free(temp_path);
}
}
free(print_path);
算法中的不变量(或应该是)print_path
总是指向动态的mallocated内存。请注意我们每free
只有一个malloc
。
答案 1 :(得分:0)
你有2个指针:
print_paths
:指向类似['h','e','l','l','o']
的数组,此指针包含数组第一个元素的地址,在这种情况下它指向h
,让我们说地址这个h
的{{1}}是1
,因此e
的地址是2
,依此类推......因此,print_path
包含数字1
}。
temp_path
:此指针指向内存中的任何内容或随机位置。
当你致电malloc
时,malloc
会要求一些内存,并为你提供新分配内存的地址,但这个内存包含垃圾。
所以
之后print_path = (char*)malloc(temp_size);
print_path
包含新分配的内存的地址,一个大小为temp_size
的新数组,它有垃圾,假设这个地址是40,所以print_path
的值是{ {1}}。
最后,当你致电:
40
将数组strcpy(print_path, temp_path);
(temp_path
)的值复制到['h','e','l','l','o']
指向的数组,换句话说,地址print_path
而不是包含垃圾现在包含40
,h
包含41
等等。
重要的是要注意,即使地址(e
和1
)都包含值40
,修改一个地址也不会影响另一个地址。
h
的最佳位置就在free(temp_path)
结束之前,只需检查else
是否已分配内存,如果您尝试释放内存但未获得内存与temp_path
你将会度过一段美好时光。
答案 2 :(得分:0)
我相信,因为我想要做的就是将内存重新分配给同一个变量,我应该研究realloc而不是malloc。