• ベストアンサー

mallocの書式について

初心者です。プログラム上でメモリを確保するmallocという関数がありますが書式がいまいち良くわかりません・・。   戻り値? * malloc(確保する型 * 確保する数) のように書いてますけどmallocの前のはやはり戻り値?そのまえの*は?いまいちわかりません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

mallocは「確保したメモリの先頭アドレスを返す」事になっている。 「メモリの先頭アドレス」とは、簡単に言えば「ポインタ」って事。 なので「返って来た値は、何かのポインタ変数に代入するんだよ」って事。 んで、Cでは int i;  ←「int」変数 int* p;  ←「intへのポインタ」変数 って感じで「*が付いて定義されるとポインタだよ~ん」って言うお約束があるので「ポインタを返す関数」を説明する時に ほげほげ* malloc(確保する型 * 確保する数) って表記したりする。 それが「前に付いてる*の意味」だったりする。 因みに「確保する型 * 確保する数」の「*」は、単純に「掛け算」の「*」なので間違えないように。 んで「確保する型 * 確保する数」の意味は、ぶっちゃけて言うと「何バイト確保するか書け」って事。 で、Cでは「変数1個分に必要なバイト数」は「決まってない」ので「sizeofマクロ」を使用しないとならない。sizeofマクロは「指定した型や変数が使用しているバイト数」を返してくれる。 例えば、世の中の99.99%のCは「char1個は1バイト」だけど、残り0.01%は「char1個が1バイトじゃない」かも知れない。 なので「sizeof(char)」と書けば「どこに持って行っても、char1個分のバイト数」になる。 そういう訳で「charを12個分のバイト数」は「sizeof(char) * 12」と書ける事になる。 で、mallocの引数は「何バイト確保するか」な訳だから「charを12個分、確保したい」なら「malloc(sizeof(char) * 12)」と書けば良い事になる。 あとは、返って来た値を「ポインタ変数」に代入してあげれば良い。 あと、何て参考書を見たか知らないけど「とっても不親切で、書き方も悪く、記述が曖昧で、嘘も多そう」なので、次の資源回収日に古新聞と一緒に回収に出した方が良いと思う。そんな「腐った参考書」なんか参考にしちゃダメだ。

poyo3
質問者

お礼

ポインタの戻り値という事ですか。うーんなるほど。なんだかわかってきたような気がします。遅くなりましたが回答ありがとうございます。

その他の回答 (7)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.8

>例えば、世の中の99.99%のCは「char1個は1バイト」だけど、残り0.01%は「char1個が1バイトじゃない」かも知れない。 sizeof(char)は、1です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

C では「オブジェクト型のポインタ」と void * との変換はどちら向きも明示的なキャスト不要, C++ では void * 「への」変換には不要だが void * 「からの」変換には明示的なキャストが必要, です>#5.

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

malloc( )の戻り値の型は void* 型なのでこのままでは使えません。 実際に使用するポインタ型にキャストする必要がありますが C では自動的にキャストされるので書かなくても問題ありません。 int *p; p = malloc(sizeof(int) * 16); C++ では明示的にキャストしないエラーが出たかと思いますが C++ なら new 使ったほうが簡単ですね。 int *p; p = (int *)malloc(sizeof(int) * 16);

poyo3
質問者

お礼

Cでは別に書かなくてもいいんですか。書かないとわかりやすい気はしますね。voidは固定という事ですか。回答ありがとうございます。

  • phenom
  • ベストアンサー率0% (0/1)
回答No.4

ポインタ変数 = (キャスト)malloc(確保する型のサイズ * 確保する要素数) ではないでしょうか?

poyo3
質問者

お礼

そういえば()はキャストでした。その()のなかに*が付いてるのはポインタという意味ですか。多分そういうことなんだと思います。 回答ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「malloc の前の」が何を指しているのかわからんし, 「そのまえの*」も何のことかわからん. 実例を出してそれぞれどれのことを言っているのか書いてほしいな.

poyo3
質問者

お礼

str=(char*)malloc(sizeof(char)*(num+1); という感じだったのですけどこのときの(char*)の*は何かな?と思ったのですが解説があまり無くなんだか良くわかりませんでした。 説明不足でしたね。回答ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

引数の値で、どれだけの大きさの領域を確保したいかがわかります。 そして、うまく確保できたとき、その領域の先頭アドレスが mallocの戻り値となります。 うまく確保できなかったときはNULLを返します。 mallocを呼び出した側では、mallocの戻り値(非NULLかNULLか)によって その後の処理を分岐させることがあります。

poyo3
質問者

お礼

戻り値があるんですよね。そのへんが結構こんがらかってしまいますね。回答ありがとうございます。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

この辺りの説明でどうかな? http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html 返値は配列の開始アドレスじゃない?

poyo3
質問者

お礼

なるほど後ろについている*はポインタの意味ですか。 回答ありがとうございます。