malloc関数 - メモリの動的確保

malloc関数を使用するとメモリを動的に確保できます。「stdlib.h」を読み込む必要があります。

#include <stdlib.h>

void *malloc(size_t size);

malloc関数はヒープ領域にメモリを確保します。

第一引数は、割り当てるサイズをバイト単位で指定します。型はsize_t型です。size_t型は、環境によって、幅が異なりますが、16bit以上の符号なし整数とC言語仕様で定義されています。現代的な環境であれば、0~符号あり32bit整数型の最大値の範囲(0~2147483647)で、値を指定すれば安心だと想定します。(例外的な環境があれば、プリーズテルミー)。

戻り値は、確保されたメモリ領域の先頭のアドレスです。戻り値の型は、汎用ポインタ型「void*」です。どんなポインタ型にも代入できます。

malloc関数で割り当てられたメモリは、初期化されていないことに注意しましょう。

一般的なアプリケーションやライブラリで動的メモリ確保する場合は、0初期化されるcalloc関数をお勧めしています。

mallocで確保したメモリ領域は、使い終わったら、free関数を使って解放しましょう。解放し忘れるとメモリリークになります。

malloc関数のサンプル

malloc関数のサンプルを書いてみます。

配列の動的な生成

配列を動的に生成するサンプルです。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  // int32_tのサイズで、10の長さのメモリ領域を確保(4バイト*10=40バイト)
  int32_t nums_length = 10;
  int32_t* nums = malloc(sizeof(int32_t) * nums_length);
  
  // 配列の操作
  nums[0] = 10;
  printf("%d\n", nums[0]);
  
  // 解放
  free(nums);
}

構造体データの動的な生成

構造体のデータを動的に生成するサンプルです。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// 書籍情報を表現する構造体の定義
struct myapp_book {
  int32_t id;
  const char* name;
  int32_t price;
};

int main(void) {
  // 構造体の動的メモリ確保(malloc)
  struct myapp_book* book = malloc(sizeof(struct myapp_book));
  book->id = 1;
  book->name = "C99 Book";
  book->price = 2000;
  
  printf("id: %d, name: %s, price: %d\n", book->id, book->name, book->price);
  
  // メモリ解放
  free(book);
}

構造体の配列の動的な生成

構造体配列を動的に生成するサンプルです。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// 書籍情報を表現する構造体の定義
struct myapp_book {
  int32_t id;
  const char* name;
  int32_t price;
};

int main(void) {
  // 構造体の配列を動的メモリ確保
  int32_t books_length = 10;
  struct myapp_book* books = malloc(sizeof(struct myapp_book) * books_length);
  books[0].id = 1;
  books[0].name = "C99 Book";
  books[0].price = 2000;
  
  printf("books[0] id: %d, name: %s, price: %d\n", books[0].id, books[0].name, books[0].price);
  
  // メモリ解放
  free(books);
}

関連情報