第24章 malloc (cstdlib)

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