C LANGUAGE TECHNOLOGY

【C言語】malloc/calloc/realloc/alloca関数と可変長配列で動的にメモリ確保

悩んでいる人

C言語で動的にメモリ確保する方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C言語のmalloc/calloc/realloc/alloca関数と可変長配列で動的にメモリ確保する方法を紹介します.

malloc関数でメモリ確保

malloc関数は,ヒープ領域で動的にメモリ確保します.

確保したメモリの内容は初期化されません.

また,メモリを解放する時はfree関数を呼び出します.

malloc関数で動的にメモリ確保,free関数で解放するコードは以下になります.

実行結果は以下になります.

3行目の行末で個数を3と入力したら,int型は4バイトなので,3 * 4 = 12バイト分メモリ確保します.

calloc関数でメモリ確保

calloc関数は,ヒープ領域でsizeバイトをnmembの要素数分を割り当てます.

つまり,calloc関数で割り当てるバイトはsize * nmembになります.

malloc関数とは異なり,calloc関数で確保したメモリは0に初期化されます.

calloc関数を利用するコードは以下になります.

実行結果は以下になります.

malloc関数と同様です.

realloc関数でメモリ確保

realloc関数は,ポインタptrが示すメモリブロックのサイズをsizeバイトに変更します.

ptrがNULL以外の場合,ptrは以前に呼び出されたmalloc/calloc/realloc関数のいずれかの戻り値でなければなりません.

realloc関数を利用するコードは以下になります.

最初にmalloc関数で動的にメモリ確保した後に,realloc関数でメモリを追加します.

実行結果は以下になります.

3行目の行末で個数を3,7行目の行末で追加する個数を2と入力し,合計(3 + 2) * 4 = 40バイト分メモリ確保します.

realloc関数の呼び出し前の配列pの内容(4~6行目)が,呼び出し後も同じであることがわかります(8~10行目).

alloca関数でメモリ確保

alloca関数は,自動的に解放されるメモリを確保します.

malloc/calloc/realloc関数はヒープ領域でメモリ確保するのに対して,alloca関数はスタック領域でメモリ確保します.

一般的には,alloca関数はmalloc/calloc/realloc関数より高速に動作します.

alloca関数は,GCC/Clangで利用できますが,Visual Studioで利用できないことに注意して下さい.

alloca関数を利用するコードは以下になります.

実行結果は以下になります.

可変長配列でメモリ確保

C99規格から導入された可変長配列でメモリ確保します.

alloca関数と同様に可変長配列は,GCC/Clangで利用できますが,Visual Studioで利用できないことに注意して下さい.

可変長配列でメモリ確保するコードは以下になります.

実行結果は以下になります.

まとめ

C言語のmalloc/calloc/realloc/alloca関数と可変長配列で動的にメモリ確保する方法を紹介しました.

動的にメモリ確保する方法は便利なので,使いこなしましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , , , ,