メモリに関する記事です。
メモリの操作をする際に使用する関数について解説しています。
メモリの確保
変数や配列を宣言すると、自動的にメモリが確保されます。
このことを、静的なメモリ確保と言います。
それとは逆に、プログラムの処理としてメモリを確保する方法があります。
このことを、動的なメモリ確保と言います。
動的に確保したメモリは、必要無くなった際に自分で解放します。
malloc()
malloc()は、指定したバイト数のメモリ領域を動的に確保し、その先頭のアドレスを返す関数です。
戻り値はvoid型となっており、メモリの確保に失敗した場合は、NULLが返されます。
ちなみに、【malloc】は【マロック】と読みます。
malloc(割り当てるバイト数)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <malloc.h> // malloc()を使用するために必要
int main()
{
char* buf;
buf = (char*)malloc(sizeof(char) * 100);
return 0;
}
free()
malloc()関数で確保したメモリ領域は、free()関数で解放します。
free(ポインタ)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <malloc.h> // malloc()を使用するために必要
int main()
{
char* buf;
buf = (char*)malloc(sizeof(char) * 100);
free(buf);
return 0;
}
calloc()
calloc()は、メモリを確保し、要素を0に初期化する関数です。
ちなみに、【calloc】は【キャロック】と読みます。
calloc(要素数, 要素のサイズ)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <malloc.h> // calloc()を使用するために必要
int main()
{
int num_elements = 5; /* 要素数 */
int element_size = sizeof(int) * num_elements; /* 要素のサイズ */
void* ptr = calloc(num_elements, element_size);
return 0;
}
realloc()
realloc()は、一度確保したメモリを違うサイズで確保し直す関数です。
ちなみに、【realloc】は【リアロック】と読みます。
realloc(既存メモリのポインタ, 新しく確保するサイズ)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <malloc.h> // malloc()を使用するために必要
int main()
{
char *buf, *buf2;
buf = (char*)malloc(sizeof(char) * 100);
buf2 = (char*)realloc(buf, sizeof(char) * 10);
return 0;
}
memset()
memset()は、メモリブロックを特定の値で埋める関数です。
ちなみに、【memset】は【メムセット】と読みます。
memset(メモリへのポインタ, 設定値, メモリのバイト数)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <memory.h> // memset()を使用するために必要
int main()
{
char A = 5;
char *buf = &A;
memset(buf, 0, sizeof(char));
return 0;
}
memcpy()
memcpy()は、メモリの内容をコピーする関数です。
ちなみに、【memcpy】は【メムコピー】と読みます。
memcpy(コピー先のポインタ, コピー元のポインタ, コピーするバイト数)
コーディング例①
#include <stdio.h> // printf()を使用するために必要
#include <memory.h> // memset()を使用するために必要
int main()
{
char A = 5;
char B = 10;
char* buf, * buf2;
buf = &A;
buf2 = &B;
memset(buf, 0, sizeof(char));
memcpy(buf2, buf, sizeof(char));
return 0;
}
new・delete
C++からは、【new】を使用することでもメモリを確保することが出来ます。
【new】で確保したメモリは、【delete】で解放します。
ポインタ = new データ型;
コーディング例①
int main() {
// メモリの確保
int* pNum;
pNum = new int;
// メモリの解放
delete pNum;
return 0;
}
オブジェクトの動的な生成方法に関しては、クラスの記事を参照してください。
配列の場合
配列用のメモリを解放する際は、配列名の前に[]を記述します。
[]を記述しない場合は、配列の最初の要素のみを解放します。
コーディング例①
int main() {
// メモリの確保
int *pNum;
pNum = new int[5];
// メモリの解放
delete [] pNum;
return 0;
}