C言語での動的メモリアロケーション
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/02 03:24 UTC 版)
「malloc」の記事における「C言語での動的メモリアロケーション」の解説
mallocはC言語におけるヒープ領域からのメモリ確保に使われる基本関数である。その関数プロトタイプはstdlib.hヘッダに次のように定義されている。 void *malloc(size_t size) ここで、sizeバイトのメモリが確保される。確保が成功するとそのメモリブロックへのポインタが返される。 ANSI Cにおいてmallocが返すのは、void型へのポインタ (void *) であり、そのポインタが指す領域のデータ型が不明であることを示している。C言語では汎用ポインタvoid *と任意の型TへのポインタT *との間の型変換 (キャスト) は暗黙的に実行されるため、mallocの戻り値は特に明示的な型変換を記述せずとも任意の型へのポインタ変数にそのまま代入できる。しかし、明示的に型変換を記述する必要が無いにもかかわらず、あえて意図的に型変換を記述することもある。明示的に型変換を記述する目的は、かつてANSI以前の仕様のC(K&R C)においては、void *が存在せず、mallocはchar *を返していたからである。また、C言語よりも厳密な型システムを持つC++では、T *からvoid *への型変換は暗黙的に行なわれるものの、void *からT *への型変換は暗黙的に行なわれないため、C/C++両方でコンパイルすることのできるソースコードを書く際には型変換の記述が必要となる。 int *ptr = (int *)malloc(sizeof(int) * 10); しかし、stdlib.hをインクルードし忘れた場合(malloc関数の前方宣言がない場合)、Cコンパイラはmallocがint型を返す関数であるとみなす。mallocの戻り値を明示的に型変換していると、ヘッダーをインクルードし忘れたことに気づかない。一方、明示的に型変換していないと、コンパイル時にintをポインタ型変数に代入しようとしているとして何らかの警告あるいはエラーメッセージがコンパイラから表示されることでインクルード忘れに気づける可能性がある。例えば64ビットのシステムでLP64というデータモデルを採用している場合、longとポインタは64ビットだが、intは32ビットとなる。この場合stdlib.hのインクルード忘れに気づかないと、mallocが実際には64ビットのポインタを返すのに、32ビットの値を返すと暗に宣言したことになり、バグが生じる可能性がある。ただし、多くのコンパイラは宣言のない関数を使用していると(キャストの有無にかかわらず)コンパイル時に警告を出す。
※この「C言語での動的メモリアロケーション」の解説は、「malloc」の解説の一部です。
「C言語での動的メモリアロケーション」を含む「malloc」の記事については、「malloc」の概要を参照ください。
- C言語での動的メモリアロケーションのページへのリンク