プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • C言語
  • 【C言語】メモリの基本、メモリを扱う関数
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【C言語】メモリの基本、メモリを扱う関数

03.02

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

メモリとは?

コンピュータ内部で情報記憶を担当するICチップのことです。

8GB、16GB等製品によって記憶容量が異なります。

1つのマスに1バイトの情報を書き込むことができ、先頭を0として何番目の場所であるかを指定して情報を書き込みます。

どれくらいのマス目があるの?

16GBのメモリの場合は、約1600億個のマス目があります。

プログラムの記述におけるメモリの動作

記述 メモリの挙動
変数宣言 メモリ領域を確保する。
変数に代入 メモリ領域の値を書き込む。
変数から値を取得 メモリから情報を読み出す。

メモリの各領域

領域名 説明
スタック領域 プログラム内の変数、配列、引数、戻り値等を格納する領域です。

「関数が使う一時的なデータ置き場」という意味合いがあり、小さな容量しか準備されないので、配列等は基本的には大きな容量を確保することができません。

ヒープ領域 メモリ制御命令を使うときに利用される領域です。
静的領域 内容が変わらない定数、リテラル情報、staticがつけられた特殊変数を格納

メモリ関連関数

C言語では、メモリアクセスに関連したよく出る関数があります。

いずれも「#include<string.h>」という標準のヘッダファイルをインクルードする必要があります。

memcpy

配列等のメモリ領域を別のメモリ領域に丸々コピーすることができます。

構文

1
void* memcpy(void* コピー先アドレス,const void* コピー元アドレス,size_t コピーするバイト数);

注意点

この関数は「浅いコピー(shallow copy)」をしているという点です。

構造体や、配列自体のアドレス領域は丸々コピーしますが、もし構造体や配列の中にポインタ型のメンバが含まれている場合は、含まれている構造自体はコピーをしません。

memcmp

メモリ領域同士が合致しているか比較することができます。

通常の配列では、「あるメモリ領域と別のメモリ領域を直接イコール演算子で比較」はできないので、それを実現したい場合はこれを使うことになります。

memset

メモリ領域を特定の情報(0等)で埋める(初期化する)ことができます。

配列等で使用するメモリ領域を言葉通り初期化したい場合に使います。

malloc

ヒープ領域に連続したメモリを確保します。

構文

1
void* malloc(サイズ);

通常の配列であれば、メモリのスタック領域に入っているので、関数が終わると解放されて使えませんが、mallocを使うとヒープ領域に確保されるので自動開放されることはありません。

free関数を使って、プログラマがメモリを手動で解放してあげる必要があります。もし、解放しなければメモリリークが発生して、PC内のメモリを食いつぶしてしまいます。

free

mallocで確保したメモリ領域を手動で解放します。

構文

1
void free(void* 変数名);

calloc

mallocに似ているが違う点としては、メモリを確保した直後に内容を0で埋めてしまう点。

malloc後にmemsetで0で初期化しているような処理があれば、こちらの方がスマートなので、こちらを使うようにしましょう。

スポンサーリンク
  • 2019 03.02
  • miyabisan2
  • コメントを書く
  • C言語
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 03.06

    【C言語】「ビルド」作業の知識と効率化について(make等)

  2. 2019 03.17

    【C言語】「配列」利用における注意点

  3. 2019 03.05

    【C言語】「ヘッダーファイル」、「プリプロセッサ」や「マクロ処理」について

  4. 2019 03.05

    【C言語】「コンパイラ」、「リンカ」の役割

  5. 2019 03.17

    【C言語】「ナル文字」について

  6. 2019 03.02

    【C言語】変数の型、文字列型について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【C言語】変数の型、文字列型について

【マイクロソフト】.NET Framework、マネー…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー