0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

mallocについて

Last updated at Posted at 2021-12-10

#malloc
1.mallocとは何か
2.どう使用するのか
3.まとめ

#1.mallocとは何か
・「マロック」、「 エムアロック」と呼ばれている
・「memory(メモリ)」と「allocation(割り当て)」を組み合わせた名称になっている
・メモリ領域を動的に確保するときに使用する
・成功時には確保したメモリのアドレスが、失敗時には NULL が返却される

#2.どう使用するのか

###定義の仕方

#include <stdlib.h>
void *malloc(size_t);

#include <stdlib.h>
 これを宣言しないと、malloc関数は使えない

(size_t)
 確保したいメモリのバイトサイズ

###サンプル

プログラムは
1.学生数を入力
2.学生分の点数を入力
3.「X人目:XX点」の形で出力
というものです。

可読性の低いプログラムですがお許しください。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 

int main()
{
    int num,i;

    //ポインタの設定
    int* p;

    printf("生徒人数は?");
    scanf("%d", &num);

     //(型*)malloc(sizeof(型)  * 大きさ); 
     p = (int*)malloc(sizeof(int) * num);

     //もしメモリを割り当てられなければプログラム終了
     if (p == NULL) exit(1);

     for(i=0;i<num;i++)
     {
        //「p+1」→ ポインタの位置を1つずらしている
        scanf("%d", p+i);
     }

    for (i = 0; i < num; i++)
    {
        printf("%d人目:%d点\n", i + 1, *(p+i));
    }
    free(p);
}

↓ malloc部分を説明

int* p;
p = (int*)malloc(sizeof(int) * num);

p = (int*)
 (int*)には、pポインタと同じ型を入れる

sizeof()
 引数に型名を指定すれば、指定した型のサイズを取得することができる

(sizeof(int) * num)
 int型メモリサイズ[sizeof(int)]を、num個用意する[* num]

↓ 最後に忘れてはいけないfreeの説明

free(p);

動的に確保したメモリを解放しなくてはならない。そのときにfree(ポインタ)を行う。
free() を忘れてしまうと、メモリーリーク(メモリを確保し続けて、システムのメモリをだんだん消費していく現象)が起こってしまう。
プログラムが終了するまでシステムのメモリ資源を無駄に占有し続けることになる。

#3.まとめ

メリットとして、ソースコード記述時にメモリ使用量を決める必要がないところがある。
また、柔軟なメモリ割り当てが可能です。

私は、知識不足なところがあるのでこれからもお互いに頑張っていきましょう!

 

0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?