序文
この記事では、動的メモリ割り当てと、 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) 元のスペースの後に十分なスペースがありません。
使用するヒープ領域で適切なサイズの別の連続領域を見つけます。この関数は、新しいメモリ アドレスを返します。
要約する
この記事は以上です。