ユーザー入力を取得するように設計された関数を作成しました。ユーザー入力を保持する変数にメモリを割り当てる必要がありますが、その変数は関数の最後に返されます。割り当てられたメモリを解放し、変数の値を返す適切な方法は何ですか?
コードは次のとおりです:
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()
。
しかし、あなたのコードには他にも対処すべき問題がある
MAX_SIZE
char
sにスペースを割り当てているので、 を で乗算する必要があります。sizeof(char)
これは1
であり、はポインターをsizeof(char *)
割り当てますMAX_SIZE
。また、代わりに 関数パラメーターを作成することもできます。これは、固定バッファーを割り当てる場合は、のようなサイズのMAX_SIZE
配列を で定義し、それを にパラメーターとして渡すことができるため、および を回避できるからです。main()
MAX_SIZE
char input[MAX_SIZE]
readInput()
malloc()
free()
これだけのスペースを割り当てているのに、ループ内でオーバーフローを防止していない場合は
while
、次の点を確認する必要がありますi < MAX_SIZE
。