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

tmpまず、実際に割り当てられていることを確認する必要があります(つまりmalloc、失敗していません):

tmp = (char *)malloc(STR_LEN * sizeof(char));
if (tmp == NULL) {
  // quit now !
}

次に、あなたがそうするstrcatように、あなたは空の文字列であることを確認する必要がありtmpます、すなわちその最初の文字は0です

tmp[0] = '\0';

そうすれば、あなたはそれをあなたが書いた方法で解放することができます。

最後にもう1つ、次のことを確認する必要が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 に答える
1

はいfree。ただし、メモリを割り当てていることを明確にする別の名前を検討することもできます。sprintfまた、 2つの文字列を組み合わせstrdupたり、1つをコピーしたりするために使用できます。

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
于 2012-11-09T19:27:34.397 に答える
0

malloc()、、calloc()またはを使用してメモリを作成するときは、常にエラーチェックを実行してくださいrealloc()

freeはい、ここで使用できます

free(section_name)tmp返されたが格納されているため、section_nameこれは現在、mallocされたメモリを指しています。

于 2012-11-09T18:19:46.520 に答える
0

私はSTR_LEN十分な大きさになるであろう信仰の飛躍をするつもりです。もしそうなら、それでfree(section_name);十分でしょう。strcpynull文字列の代わりに使用するstrcatか、null文字列を初期化します。

于 2012-11-09T18:23:18.483 に答える