動的メモリ管理 (malloc、calloc、realloc 関数の使用)


序文

この記事では、動的メモリ割り当てと、 3 つの動的メモリ関数malloc、calloc、および reallocについて紹介します。


1. malloc 関数

1.malloc

C 言語には動的メモリ開発関数 malloc があり、その標準形式は次のとおりです。

void *malloc(size_t size);

この関数は、メモリから連続して使用可能なスペースに適用され、このスペースへのポインターを返します。
(1) 割り当てが成功した場合は、割り当てられた領域へのポインタを返します。
(2) 確保に失敗した場合は NULL ポインタを返す (malloc の戻り値を確認する必要がある)
(3) 戻り値の型はvoid * であり、使用する際には割り当てられた空間の型を定義する必要がある。

2.無料

C 言語には、動的メモリの解放と回復専用の別の関数 free が用意されています。関数のプロトタイプは次のとおりです。

void free (void* ptr);

free 関数は、動的に割り当てられたメモリを解放するために使用されます。

(1) パラメータ ptr が指す空間が動的にオープンされていない場合、free 関数の動作は未定義です。
(2) パラメータ ptr が NULL ポインタの場合、関数を解放する必要はありません。

注: stdlib.h ヘッダー ファイルでは、malloc と free の両方が宣言されています。

3. 機能適用

最初に例を見てみましょう:

#include<stdio.h>
int main()
{
    
    
	//代码1————错误
	int num = 0;
	scanf("%d", &num);
	int arr[num] = {
    
     0 };
	return 0;
}

ご覧のとおり、このプログラムにはエラーがあります。

ここに画像の説明を挿入
この場合、動的メモリ割り当てを使用できます。
例:

#include <stdio.h>
#include<stdlib.h>
int main()
{
    
    
	int num = 0;
	scanf("%d", &num);
	int* ptr = NULL;
	ptr = (int*)malloc(num * sizeof(int));
	if (NULL != ptr)//判断ptr指针是否为空
	{
    
    
		int i = 0;
		//将申请到的空间初始化为 0
		for (i = 0; i < num; i++)
		{
    
    
			*(ptr + i) = 0;
		}
	}
	//输出
	for (int i = 0; i < num; ++i)
	{
    
    
		printf("%d ", *(ptr + i));
	}
	free(ptr);//释放ptr所指向的动态内存
	return 0;
}

結果:
ここに画像の説明を挿入
分析:
ここに画像の説明を挿入


二、calloc関数

1.calloc

C 言語には calloc という関数も用意されており、動的メモリ割り当てにも使用されます。プロトタイプは次のとおりです。

void* calloc (size_t num, size_t size);

(1) 関数の機能は、サイズが size である num 要素のスペースを開き、スペースの各バイトを 0 に初期化することです。
(2) 関数 malloc との違いは、calloc がアドレスを返す前に、要求された空間の各バイトをすべて 0 に初期化することです。

2. 機能適用

例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
	
	int* p = calloc(10, sizeof(int));
	if (NULL != p)
	{
    
    
		for (int i = 0; i < 10; ++i)
			{
    
    
				printf("%d ", *(p + i));
			}
	}
	free(p);
	p = NULL;
	return 0;
}

結果:
ここに画像の説明を挿入


3、再割り当て機能

再割り当て

realloc 関数の出現により、動的メモリ管理がより柔軟になります。動的に割り当てられるメモリのサイズを調整できます。関数のプロトタイプは次のとおりです。

void* realloc (void* ptr, size_t size);

(1) ptr は調整するメモリアドレスsize は調整後の新しいサイズ
(2) 戻り値は調整後のメモリの開始位置です。

realloc がメモリ空間を調整する状況は 2 つあります。1
) 元の空間の後に十分な空間がある。
ここに画像の説明を挿入
メモリを直接拡張すると、元のメモリの後にスペースが追加され、元のスペースのデータは変更されません

2) 元のスペースの後に十分なスペースがありません。
ここに画像の説明を挿入

使用するヒープ領域で適切なサイズの別の連続領域を見つけます。この関数は、新しいメモリ アドレスを返します。


要約する

この記事は以上です。

おすすめ

転載: blog.csdn.net/m0_53689542/article/details/122661394