35.1メモリの使用

8676 ワード

34章では,ポインタを用いて変数のメモリアドレスをポインタに格納する.次に、必要に応じてポインタにメモリ領域を割り当てる方法を見てみましょう.

メモリ使用モード


  • メモリはmalloc→使用→freeモードで
  • 使用

    メモリの割り当て


    メモリを使用するには、malloc 함수のメモリ容量が使用されていることを確認する必要があります.
  • malloc : memory alloccate
  • に必要なメモリサイズはバイト単位で指定します.
  • メモリ割り当て、解放関数はstdlibです.hファイルで宣言します.
  • メモリ割当て

  • ポインタ=malloc(サイズ);
  • void *malloc(size_t_Size);
  • メモリアドレスが正常に返され、NULL
  • が失敗しました.
    #include <stdio.h>
    #include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
    
    int main()
    {
      int num1 = 20;    // int형 변수 선언
      int *numPtr1;     // int형 포인터 선언
    
      numPtr1 = &num1;  // num1의 메모리 주소를 구하여 numPtr에 할당
    
      int *numPtr2;     // int형 포인터 선언
    
      numPtr2 = malloc(sizeof(int));    // int의 크기 4바이트만큼 동적 메모리 할당
    
      printf("%p\n", numPtr1);    // 006BFA60: 변수 num1의 메모리 주소 출력
                                  // 컴퓨터마다, 실행할 때마다 달라짐
    
      printf("%p\n", numPtr2);     // 009659F0: 새로 할당된 메모리의 주소 출력
                                  // 컴퓨터마다, 실행할 때마다 달라짐
    
      free(numPtr2);    // 동적으로 할당한 메모리 해제
    
      return 0;
    }
  • ポインタにメモリを割り当てる場合は、malloc関数を使用してポインタに割り当てられたメモリ領域サイズを入れます.上記のコードはsizeof演算子を使用してintサイズ(4バイト)の空きメモリのみを割り当てます.
  • ダイナミックメモリ割り当て

  • は、동적 메모리 할당(dynamic memeory allocation)と呼ばれるメモリを任意に割り当てることができる.
  • 	numPtr2 = malloc(sizeof(int));
        // int의 크기 4바이트만큼 동적 메모리 할당

    呑桟と尻


    上記のコードではnumptr 1は通常変数にメモリアドレスを割り当て,numptr 2はmalloc関数にメモリを割り当てた.
    同じメモリアドレスでも内部に差があります.

    1.スタック(スタック)

  • 変数はスタックで生成されます.
  • スタックで生成された変数は、使用後に処理されなくてもよい.
  • 2.お尻(heap)

  • malloc関数はお尻のメモリを使用します.
  • 関数を使用してhipに割り当てられたメモリは解放される必要があります.
  • ❗メモリが無効


    スタックとhipの最大の違いは、メモリの解放です.
  • free(ポインタ);
  • void free(void *_Block);
  • メモリを解放せずに
  • メモリのみを割り当てると、最終的にはシステムメモリが不足し、オペレーティングシステムがプログラムを強制的に終了したり、メモリ割り当てに失敗したりします.
  • したがって、メモリの解放は選択ではなく必須です.
  • 特に、メモリを解放しないためメモリ使用量が増加する現象を메모리 누수(memory leak)と呼ぶ.
  • スタック、hipの位置、および成長方向は、オペレーティングシステムおよびプラットフォームによって異なる場合があります.
  • メモリに値を保存


    割り当てられたメモリに値を保存してみます.
    #include <stdio.h>
    #include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
    
    int main()
    {
        int *numPtr;    // int형 포인터 선언
    
        numPtr = malloc(sizeof(int));    // int의 크기 4바이트만큼 동적 메모리 할당
    
        *numPtr = 10;   // 포인터를 역참조한 뒤 값 할당
    
        printf("%d\n", *numPtr);    // 10: 포인터를 역참조하여 메모리에 저장된 값 출력
    
        free(numPtr);    // 동적 메모리 해제
    
        return 0;
    }
  • malloc関数で指定したメモリに値を格納する場合は、ポインタを逆方向に参照して値を保存するだけです.
  • と同様にprintf関数を使用して値を出力する場合は、逆参照ポインタで値を取得することもできます.
  • メモリの割り当てと使用後は、free 함수に解除する必要があります.
  • 注意)malloc関数にsizeof(int)*1024*1024*1024を入れたらどうなりますか?

    numPtr2 = malloc(sizeof(int) * 1024 * 1024 * 1024);
    計算すると、GiBは4 GiBで、よく配分されています.より大きなメモリを割り当てることができますが、実際のメモリ値はシステムの制限(RAM、ディスク)を超えてはいけません.

    ソース


    https://dojang.io/mod/page/view.php?id=284
    https://dojang.io/mod/page/view.php?id=285
    https://dojang.io/mod/page/view.php?id=286