割り当てるのは、ゼロで終了する形式で格納された、正確に1つの文字列用のスペースです。
複数の文字列の配列を格納する場合は、 PLUSの複数の文字列malloc()
の配列を使用する必要があります。char *
また、gets()
サイズ制限がないため安全ではありません。代わりに、を使用してfgets()
ください。次の署名があります。
char *fgets(char *restrict s, int n, FILE *restrict stream);
ストリームが必要なので、を指定する必要がありますstdin
。
したがって、1行を読むための最良の方法は
char * read_one_line(uint32_t maxbufsize)
{
char * s = malloc(maxbufsize);
if (!fgets(s, maxbufsize, stdin)) {
free(s);
return NULL;
} else {
char * s2 = realloc(s, strlen(s)+1); // +1 for the NUL at the end
if (s2) {
return s2;
} else {
return s; // should never happen as the memory block is shrinked
}
}
}
この関数は、1行に必要なメモリを割り当て、読み取り後に適切にサイズを変更し、適切な時間に再度解放するために呼び出し元に任せます。