我有以下函数在我的代码中被多次调用:
char* get_section_name(const char* section, const char* value) {
char *tmp = (char *)malloc(STR_LEN * sizeof(char));
if(strlen(section)>0) {
strcat(tmp, section);
strcat(tmp,".");
}
strcat(tmp, value);
return tmp;
}
我在其他函数中调用它:
section_name = get_section_name(data->model_name,"params_default");
释放这段记忆的最佳方法是什么?我可以在完成后拨打free(section_name)
吗?
答案 0 :(得分:1)
首先,您必须确保tmp
实际已分配(即malloc
未失败):
tmp = (char *)malloc(STR_LEN * sizeof(char));
if (tmp == NULL) {
// quit now !
}
然后,当你strcat
时,你必须确保tmp
是一个空字符串,即它的第一个字符是0
tmp[0] = '\0';
然后,是的,您可以按照编写它的方式释放它。
最后一件事:你必须确定strlen(section)+strlen(".")+strlen(value) < STR_LEN
,否则你将覆盖你不应该的记忆。
答案 1 :(得分:1)
free
在这里会很棒,但作为替代方案,可能最好的方法是改变签名。如果你喜欢
void get_section_name(const char* section, const char* value, char * result)
然后你可以传递一个指向已分配内存的指针,因此这个函数的用户完全知道在使用它之后应该如何处理内存。
答案 2 :(得分:1)
是free
,但是,您可以考虑使用另一个名称来表明它正在分配内存。此外,您可以使用sprintf
组合2个字符串,strdup
只复制一个字符串。
char* create_section_name(const char* section, const char* value) {
const int sectionLen = strlen(section);
if(sectionLen>0) {
//+1 for the period and +1 for the null
char *tmp = (char *)malloc((sectionLen + strlen(value) + 2) * sizeof(char));
//do that often? consider a newString(size) macro. See below
sprintf(tmp, "%s.%s", section, value);
return tmp;
}
else {
return strdup(value);
}
}
这假设您不需要完整的STR_LEN
,它在两种情况下都使用得足够。
newString
宏:
#define newString(size) (malloc((size) * sizeof(char)))
或者它甚至可以自动为null添加一个:
#define newString(size) (malloc(((size)+1) * sizeof(char)))
然后将malloc替换为:
char *tmp = newString(sectionLen + strlen(value) + 1); //+1 for period
答案 3 :(得分:0)
使用malloc()
,calloc()
或realloc()
是的,您可以在此使用free
free(section_name)
,因为返回的tmp
存储在section_name
中,现在指向malloced内存。
答案 4 :(得分:0)
我将实现STR_LEN
足够大的信念的飞跃。如果是这样,那么free(section_name);
就足够了。 Bur使用strcpy
代替strcat
或初始化空字符串。