PR

【C・C++】メモリとは?【静的・動的・関数】

アイキャッチ C++
この記事は約5分で読めます。

メモリに関する記事です。
メモリの操作をする際に使用する関数について解説しています。

のんびり丸

WEBアプリの開発等をしています。
日々の学習の備忘録として運営していこうと思います。

のんびり丸をフォローする

メモリの確保

変数や配列を宣言すると、自動的にメモリが確保されます。
このことを、静的なメモリ確保と言います。

それとは逆に、プログラムの処理としてメモリを確保する方法があります。
このことを、動的なメモリ確保と言います。

動的に確保したメモリは、必要無くなった際に自分で解放します。

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;
}
タイトルとURLをコピーしました