malloc関数について


C言語を勉強中の者です。  
参考書にて下記のmalloc関数のプログラムが書かれていたのですが、  
`str = (char *)`の部分から何がどう行われているのかわかりません。

説明できる方よろしくお願いいたします。

[code]

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
       char *str;
       int num,i;
    
       printf("何文字のAを用意しますか？\n");
       scanf("%d",&num);
    
       str = (char *)malloc(sizeof(char) * (num+1));
       if(!str){
         printf("メモリを確保できませんでした。\n");
         return 1;
       }
    
    
       for(i=0;i<num;i++){
           *(str+1) = 'A';
       }
       *(str+num) = '\n;
       printf("%sを用意できました。\n",str);
    
       free(str);
    
       return 0;
    }
    
[/code]




`malloc()` の話をする前に確認事項ですが [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
において「文字列」とは

  * `char` の配列、ないしは相当する連続領域で
  * `'\0'` 文字で終了するもの
  * があるとき、その先頭アドレス（先頭要素へのポインタ右辺値）をもって「文字列」とする

です。

[code]

    char hello[] = "Hello!";
    
[/code]

であれば真に配列です。コンパイラが、ソースコード上には書かれていない `'\0'` 文字を `!`
の後ろにくっつけることを行っているので、先の「文字列」の条件を満たしています。ちなみに、この配列変数 `hello` は合計７文字分の配列となります。

さて `malloc(n)` が何をするかというと

  * 最低 `n` バイトの連続したメモリ領域をどこかに取得します
  * ここでいう「バイト」とは `char` １個が格納できる大きさのことを言います
  * その先頭アドレス（先頭要素へのポインタ右辺値）を返却します
  * よって `malloc(n)` が返してきた値（＝連続メモリ領域）には最低 `n` 文字が格納できます
  * (最低 `n` 文字ということは) `n+1` 文字は格納できない前提で処理を行う必要がある

ここまで、先の「文字列」の条件の最初と最後のものに合致していますよね。更に「文字列」のもう一つの条件である `'\0'` があることを満たしてやれば
`malloc()` の結果を「文字列」として扱うことができます。

  * `num` 文字の `'A'` を格納し
  * その後ろに `'\0'` を追加格納したい
  * のであれば `malloc()` の引数には `num+1` を渡す必要がある

とまでわかれば解説になるでしょうか。

