1

我有以下函数在我的代码中被多次调用:

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)吗?

4

5 回答 5

1

Yes free, however, you could consider a different name that makes it clear it is allocating memory. Also, you could make use of sprintf for combining 2 strings and strdup for just copying one.

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);
  }
}

This assumes you don't need the full STR_LEN, it uses just enough in both cases.

newString macro I suggested:

#define newString(size) (malloc((size) * sizeof(char)))

Or it can even automatically add one for the null:

#define newString(size) (malloc(((size)+1) * sizeof(char)))

Then malloc is replaced with this:

char *tmp = newString(sectionLen + strlen(value) + 1); //+1 for period
于 2012-11-09T19:27:34.397 回答
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,否则你会覆盖你不应该覆盖的内存。

于 2012-11-09T18:21:14.957 回答
1

free在这里会很好,但作为替代方案,最好的方法可能是更改签名。如果你让它像

void get_section_name(const char* section, const char* value, char * result)

然后你可以传递一个指向分配内存的指针,所以这个函数的用户完全知道他应该如何处理使用后的内存。

于 2012-11-09T18:24:26.513 回答
0

malloc()使用、calloc()或创建内存时始终执行错误检查realloc()

是的,你可以free在这里使用

free(section_name), 因为tmp返回的存储section_name现在指向 malloced 的内存。

于 2012-11-09T18:19:46.520 回答
0

我将做出STR_LEN足够大的信仰飞跃。如果是这样free(section_name);就足够了。Bur 使用strcpy代替strcat或初始化一个空字符串。

于 2012-11-09T18:23:18.483 回答