割り当てられるのは、ゼロ終了フォーマットで格納された、正確に1つの文字列のためのスペースです。
複数の文字列の配列を格納する場合は、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
}
}
}
この機能が適切に読んだ後、それをリサイズし、一行に必要なメモリを割り当て、適切な時期に再びそれを解放するために、呼び出し元にそれを残しています。
sizeof(char)は冗長です。それはC標準によって定義され、1であることが要求されます。 – glglgl
@glglgl right、sizeof(char)は冗長です。代わりにmalloc(1 * t)を使うべきです。 – Jaguar
なぜ 'malloc(t)'だけではないのですか? :-) – glglgl