c语言 - 释放被函数错误处理的字符*


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* mkstr(char str1[], char str2[])
{
char* out = malloc(sizeof(*str1) + sizeof(*str2) + 1);
strcpy(out, str1);
strcat(out, str2);
return out;
}
int main()
{
char* str = mkstr("i use ","arch btw");
printf("%sn",str);
}

main()调用mkstr()时,mkstr()将malloc一个名为outchar*。如何从该代码中正确地free(out)?我可以顺其自然吗?或者操作系统会释放malloc的空间吗?

这是最好的方法吗,还是有更好的方法?

我使用的是Linux(如果相关的话(。

sizeof(*x)是平台上指针的大小。在32位平台上通常为4,在64位平台上为8。

要获得字符串的长度,您需要使用strlen函数。

更正代码:

char* mkstr(char str1[], char str2[])
{
// you need to use strlen to get the length of a string
char* out = malloc(strlen(str1) + strlen(str2) + 1);
strcpy(out, str1);
strcat(out, str2);
return out;
}
int main()
{
char* str = mkstr("i use ","arch btw");
printf("%sn",str);
free(str);           // simply free str
}

理论:

在退出应用程序之前,每个堆分配的对象都应该被释放(大多数现代操作系统都会管理堆分配,即使您在离开应用程序时没有释放它们(。顺便说一下,释放堆资源是一种很好的做法。

代码中的问题:

  1. mkstr函数的参数应为(const char *str1, const char *str2),而不是(char str[], char str2[])
  2. 使用calloc而不是malloc以获得更好的安全性
  3. 使用strlen函数来确定字符串的长度,而不是sizeof
  4. 设置void(int argc, char const **argv)作为main函数的参数

现在"空闲"堆分配:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mkstr(const char *str1, const char *str2)
{
char *out = calloc((strlen(str1) + strlen(str2) + 1), sizeof(char));
strcpy(out, str1);
strcat(out, str2);
return out;
}
int main(int argc, char const **argv)
{
char *str = mkstr("i use ", "arch btw");
printf("%sn", str);
free(str); // freed the heap allocated resource before exiting
return 0;
}

无论如何,在阅读了所有答案之后,这就是新代码。

char* mkstr(char str1[], char str2[])
{
char* out = malloc(strlen(str1) + strlen(str2) + 1);
strcpy(out, str1);
strcat(out, str2);
return out;
}
int main()
{
char* str = mkstr("i use ","arch btw");
printf("%sn",str);
free(str);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新