質問: (char *)malloc(sizeof(char) * (num+1)); if(!str){ printf("メモリを確保できませんでした。\n"); return 1; } for(i=0;i
回答: `malloc()` の話をする前に確認事項ですが [c](/questions/tagged/c "'c' のタグが付いた質問を表示") において「文字列」とは * `char` の配列、ないしは相当する連続領域で * `'\0'` 文字で終了するもの * があるとき、その先頭アドレス(先頭要素へのポインタ右辺値)をもって「文字列」とする です。 ``` char hello[] = "Hello!"; ``` であれば真に配列です。コンパイラが、ソースコード上には書かれていない `'\0'` 文字を `!` の後ろにくっつけることを行っているので、先の「文字列」の条件を満たしています。ちなみに、この配列変数 `hello` は合計7文字分の配列となります。 さて `malloc(n)` が何をするかというと * 最低 `n` バイトの連続したメモリ領域をどこかに取得します * ここでいう「バイト」とは `char` 1個が格納できる大きさのことを言います * その先頭アドレス(先頭要素へのポインタ右辺値)を返却します * よって `malloc(n)` が返してきた値(=連続メモリ領域)には最低 `n` 文字が格納できます * (最低 `n` 文字ということは) `n+1` 文字は格納できない前提で処理を行う必要がある ここまで、先の「文字列」の条件の最初と最後のものに合致していますよね。更に「文字列」のもう一つの条件である `'\0'` があることを満たしてやれば `malloc()` の結果を「文字列」として扱うことができます。 * `num` 文字の `'A'` を格納し * その後ろに `'\0'` を追加格納したい * のであれば `malloc()` の引数には `num+1` を渡す必要がある とまでわかれば解説になるでしょうか。