malloc() は memory allocation を略した関数だと筆者は勝手ながら思っています。
C++ では cstdlib ヘッダーをインクルードすることで使えるようになります。
それで宣言は以下のようになります。
#include <stdlib.h> void *malloc(size_t size);
size 引数は割り当てたいバイトサイズを指定するわけです。
void* 型は関連するデータ型のないポインターです。
どの型のアドレスも保持できるし、他の型へ型変換(キャスト)できます。
あと malloc() と対で考えられる一旦割り当てたメモリー理領域を解放する関数は free() です。
#include <stdlib.h> void free(void *ptr);
ptr は解放したいアドレスのことです。
void* 型は malloc() の返り値型と同じなので、malloc() で返ってきたデータを保持する変数を指定すれば良いです。
つまり ptr は malloc() が返した void* 型データを代入した変数ということになります。
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 int *x; 7 x = malloc(sizeof(int)); 8 *x = 100; 9 printf("0x%lx\n",(int64_t)x); 10 printf("%d\n",*x); 11 free(x); 12 return 0; 13 }
これをビルドして実行すると以下のようになります。
$ gcc main.c $ ./a.out 0x557d810d3260 100
この例では sizeof 演算子を使って int 型を保持できるバイトサイズを size 引数に指定してメモリーを確保しています。
6 int *x; 7 x = malloc(sizeof(int)); 8 *x = 100;
x は int 型を指すポインター変数ですね。
その証拠に x の逆参照に対して整数値 100 を代入しています。
ただ malloc() 関数はヒープ領域に割り当てしているので、スタック領域のポインター変数とは違って 8 MB とか 100 MBといった上限規制にはひっかからず、大きめのデータを保持できますね。
Copyright 2018-2019, by Masaki Komatsu