返された変数のメモリを解放する適切な方法 質問する

返された変数のメモリを解放する適切な方法 質問する

ユーザー入力を取得するように設計された関数を作成しました。ユーザー入力を保持する変数にメモリを割り当てる必要がありますが、その変数は関数の最後に返されます。割り当てられたメモリを解放し、変数の値を返す適切な方法は何ですか?

コードは次のとおりです:

char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;

while((c = getchar()) != '\n' && c != EOF) {
    input[i++] = c;
}

return input;

入力のアドレスを返して、使用後に解放する必要がありますか?

入力変数を解放する最も適切な方法が知りたいです。

ベストアンサー1

free()非常に簡単です。返されるのと同じポインタを渡す限り、malloc()問題ありません。

例えば

char *readInput(size_t size)
 {
    char *input;
    int   chr;
    input = malloc(size + 1);
    if (input == NULL)
        return NULL;
    while ((i < size) && ((chr = getchar()) != '\n') && (chr != EOF))
        input[i++] = chr;
    input[size] = '\0'; /* nul terminate the array, so it can be a string */
    return input;
 }

 int main(void)
  {
     char *input;
     input = readInput(100);
     if (input == NULL)
         return -1;
     printf("input: %s\n", input);
     /* now you can free it */
     free(input);
     return 0;
  }

絶対にしてはいけないのは、

free(input + n);

input + nは によって返されるポインタではないためですmalloc()

しかし、あなたのコードには他にも対処すべき問題がある

  1. MAX_SIZE charsにスペースを割り当てているので、 を で乗算する必要があります。sizeof(char)これは1であり、はポインターをsizeof(char *)割り当てますMAX_SIZE。また、代わりに 関数パラメーターを作成することもできます。これは、固定バッファーを割り当てる場合は、のようなサイズのMAX_SIZE配列を で定義し、それを にパラメーターとして渡すことができるため、および を回避できるからです。main()MAX_SIZEchar input[MAX_SIZE]readInput()malloc()free()

  2. これだけのスペースを割り当てているのに、ループ内でオーバーフローを防止していない場合はwhile、次の点を確認する必要がありますi < MAX_SIZE

おすすめ記事