#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 一個char*被呼叫out。我怎樣才能free(out)正確地從此代碼?我可以保留它,還是作業系統會釋放 malloc 的空間?
這是最好的方法,還是有更好的方法?
我在 Linux 上(如果相關的話)。
uj5u.com熱心網友回復:
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
}
uj5u.com熱心網友回復:
理論:
在退出應用程式之前,應該釋放每個堆分配的物件(大多數現代作業系統都會管理堆分配,即使您在退出應用程式時沒有釋放它們)。順便說一句,釋放堆資源是一個很好的做法。
您的代碼中的問題:
- 函式的引數
mkstr應該(const char *str1, const char *str2)代替(char str[], char str2[]). - 使用
calloc代替以malloc獲得更好的安全性。 - 使用
strlen函式來確定字串的長度,而不是sizeof. - 設定
void或(int argc, char const **argv)作為main函式的引數。
現在`free`堆分配:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mkstr(const char *str1, const char *str2)
{
char *out = calloc(sizeof(char) * (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;
}
uj5u.com熱心網友回復:
無論如何,在閱讀了所有答案之后,這是新代碼。
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418539.html
標籤:
上一篇:試圖防止重復條目不起作用
下一篇:使用OpenMP優化矩陣轉置函式
