释放一个由函数 malloc 的 char*
Free a char* that was malloc'd by a function
#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("%s\n",str);
}
当 main()
调用 mkstr()
时,mkstr()
将 malloc 调用 out
的 char*
。我怎样才能从这段代码中正确地 free(out)
?我可以让它保持原样,还是 OS 会释放 malloc 的 space?
这是最好的方法吗,还是有更好的方法?
我在 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("%s\n",str);
free(str); // simply free str
}
理论:
在退出应用程序之前,每个堆分配的对象都应该被释放(大多数现代操作系统管理堆分配,即使您在退出应用程序时没有释放它们)。顺便说一下,释放堆资源是一个很好的做法。
您的代码中的问题:
mkstr
函数的参数应为 (const char *str1, const char *str2)
而不是 (char str[], char str2[])
。
- 使用
calloc
而不是 malloc
以获得更好的安全性。
- 使用
strlen
函数来确定字符串的长度,而不是sizeof
。
- 设置
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("%s\n", 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("%s\n",str);
free(str);
return 0;
}
#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("%s\n",str);
}
当 main()
调用 mkstr()
时,mkstr()
将 malloc 调用 out
的 char*
。我怎样才能从这段代码中正确地 free(out)
?我可以让它保持原样,还是 OS 会释放 malloc 的 space?
这是最好的方法吗,还是有更好的方法?
我在 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("%s\n",str);
free(str); // simply free str
}
理论:
在退出应用程序之前,每个堆分配的对象都应该被释放(大多数现代操作系统管理堆分配,即使您在退出应用程序时没有释放它们)。顺便说一下,释放堆资源是一个很好的做法。
您的代码中的问题:
mkstr
函数的参数应为(const char *str1, const char *str2)
而不是(char str[], char str2[])
。- 使用
calloc
而不是malloc
以获得更好的安全性。 - 使用
strlen
函数来确定字符串的长度,而不是sizeof
。 - 设置
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("%s\n", 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("%s\n",str);
free(str);
return 0;
}