拜托,你能告诉我,如果我以正确的方式免费使用我的功能吗? 我用valgrind检查了我的代码,没有发生错误。
void strconcat (char **str1, const char *str2) {
unsigned long str1len = strlen(*str1);
unsigned long str2len = strlen(str2);
char *tempStr = malloc(sizeof(char) * (str1len + str2len + 1));
memcpy(tempStr, *str1, str1len);
memcpy(&(tempStr[str1len]), str2, (str2len + 1));
free(*str1);
*str1 = tempStr;
}
在main-function中我以这种方式调用我的函数:
int main() {
char *str1 = malloc(25);
str1 = strcpy(str1, "First part of the string");
char *str2 = malloc(16);
str2 = strcpy(str2, " - second part.");
printf("%s\n", str2);
strconcat(&str1, str2);
printf("%s\n", str1);
free(str1);
free(str2);
return EXIT_SUCCESS;
}
感谢您的帮助!
答案 0 :(得分:0)
在void strconcat()
函数中空闲后,您正在将malloc'd tempStr
变量分配给*str1
,因此在使用valgrind进行调试时不会出现任何错误。
从函数中删除*str1 = tempStr
行,现在编译并运行程序将崩溃的程序。因为双重免费。
修改强>
你必须释放使用malloc分配的所有内存。在分配给其他变量之前,必须释放str1
的内存以避免内存泄漏。
free(*str1) - free for memory allocated to str1 in main() function
free(str1) - free for memory allocated to tempStr in strconcat() function.
free(str2) - free for memory allocated to str2 in main function.
答案 1 :(得分:0)
是的,你正确使用它。在strconcat()
中,当您为其分配新连接的字符串时,您将丢失最初分配给str1
的内存,因此在此之前您应该free()
。从该函数返回后,您仍然有两个动态分配的内存块,因此您应该释放这两个内存块。
Valgrind通常非常值得信赖,所以如果您正在运行所有相关的不同执行路径,那么您应该对它有信心。
你是否正在使用你的功能是一个好主意,但完全是另一回事。如果有人传入一个指向字符串文字的指针,那么你的函数就会发生灾难性的失败。您的代码还存在其他一些问题,包括strconcat
是保留的标识符,但对于它的作用,您正确使用free()
。