15強ダイナミックメモリ割り当て

15459 ワード

14強ダイナミックメモリ割り当て


動的メモリ割り当ての原理を学習します.
動的メモリ割り当てを使用して、プログラムの実行中にメモリを割り当てることができます.
C言語では、アレイに適切なサイズのメモリを事前に割り当てる必要があります.
ただし、目的のメモリのみを使用する場合は、ダイナミックメモリ割り当て(Dynamic Memory Assignment)を使用します.動的な意味は「プログラムの実行中」です.

14-1. malloc()関数


C言語の動的メモリ割当て関数.必要なメモリ容量を取得できます.メモリ割り当ては正常にアドレスを返し、失敗してNULLを返します.ライブラリで定義します.
ダイナミックメモリが割り当てられるたびに、割り当てられたポインタのアドレスが異なる場合があります.
#include <stdio.h>
#include <stdlib.h>

int main(void){
	int *a = malloc(sizeof(int));
    printf("%d\n",a);
    a = malloc(sizeof(int));
    printf("%d\n",a);
    system("pause");
    return 0;
}

int *a = malloc(sizeof(int));はintが4 bバイトであることを意味するので、4 bバイトの空間を残す.そしてそこで成功すると、aの値はメモリのアドレス値になります.
毎回アドレス出力があります.
動的に割り当てられた変数はhip領域に格納されます.

14-2 free()関数


C言語では、スタックに宣言された変数は、メモリの解放を別途行う必要はありません.ただし、動的に割り当てられた変数はfree()関数を使用してメモリを無効にする必要があります.これは、小さなプログラムとは無関係ですが、サイズが大きくなるにつれてメモリを解放しないと、メモリのプロセスが重くなり、いつかエラーが発生します.そのため、メモリの漏洩を防ぐ必要があります.
free()関数はメモリを解放します.

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

int main(void){
	int *a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a);
    a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a);
    system("pause");
    return 0;
}


ここではfree()関数を使用してメモリを解放するので、最初の値と2番目の値の大部分は同じ値を返します.

14-3.memset()


memset(ポインタ、値、サイズ);
線形範囲内のメモリを特定の値に設定する関数です.
1 byteごとに1つの値が格納されます.文字列配列処理と同様です.ライブラリに宣言があります.文字列を動的に処理する関数.特定の範囲のメモリを満たすことができます.繰り返し文よりも高速に実行されます.

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

int main(void){
	char *a = malloc(100);
    memset(a,'A',100);
    for(int i=0; i<100;i++){
    	printf("%c ", a[i]);
    }
    system("pause");
    return 0;
}
memset(a,'A',100)は、a範囲のメモリにおいて100文字の「A」文字の役割を果たすことがわかる.
#include <stdio.h>
#include <stdlib.h>

int main(void){
	int** p = (int**)malloc(sizeof(int*)*3);
    for(int i=0; i<3;i++){
    *(p+i) = (int*)malloc(sizeof(int)*3);
 	}
    
    for(int i=0; i<3; i++){
    	for(int j=0; j<3;j++){
        	*(*(p+i)+j)=i*3 + j;
        }
    }
    for (int i=0; i<3; i++){
    	for(int j=0; j<3; j++){
        	printf("%d",*(*(p+i)+j));
        }
        printf("\n")'
    }
    system("pause");
    return 0;
}
これは二重ポインタの問題です.二重配列ともいえる.
あまりよくないです.明日はなぜか聞きに行きます.