○動的なメモリの割り当て

■malloc 動的なメモリの確保

▽int配列------------------------------------------------------------------------

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

int main(char* argv[]) {

	int *ar;
	ar = (int *)malloc(3 * sizeof(int));//動的なメモリの確保 malloc(全体の大きさ)
	if (ar == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	ar[0] = 1;
	ar[1] = 2;
	ar[2] = 3;

	printf("%d %d %d",ar[0],ar[1],ar[2]);

	free(ar);//メモリの開放(使い終わったら必ず必要)
	getchar();
	return 0;
}

出力結果
1 2 3

▽文字列------------------------------------------------------------------------

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

int main(char* argv[]) {

	char *str;
	str = (char *)malloc(4 * sizeof(char));//動的なメモリの確保 malloc(全体の大きさ)
	if (str == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	str[0]='S';
	str[1]='E';
	str[2]='C';
	str[3]='\0';

	printf("%s\n",str);

	free(str);//メモリの開放(使い終わったら必ず必要)
	getchar();
	return 0;
}

■calloc 動的にメモリを確保して0に初期化
内部的にmallocを呼び出しています。

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

int main(char* argv[]) {

	int *ar;
	ar = (int *)calloc(3 , sizeof(int));//動的なメモリの確保 calloc(要素数, 要素の大きさ) 
	if (ar == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	printf("%d %d %d",ar[0],ar[1],ar[2]);

	free(ar);//メモリの開放(使い終わったら必ず必要)
	getchar();
	return 0;
}

出力結果
0 0 0

■realloc メモリの再割り当て
メモリを新たに確保して、元のメモリを複製します。
その時、元のメモリは開放されます。

メモリをコピーするために処理に時間がかかります。
再割り当て後に開放された小さいメモリ領域が残るためメモリ使用効率が悪いです。

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

int main(char* argv[]) {

	int *ar;
	ar = (int *)malloc(3 * sizeof(int));//動的なメモリの確保 malloc(全体の大きさ)
	if (ar == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	ar[0] = 1;
	ar[1] = 2;
	ar[2] = 3;

	ar = (int *)realloc(ar,5 * sizeof(int));//メモリの再割り当て realloc(再割り当て元のポインタ,全体の大きさ)
	if (ar == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	ar[3] = 4;
	ar[4] = 5;

	printf("%d %d %d %d %d",ar[0],ar[1],ar[2],ar[3],ar[4]);

	free(ar);//メモリの開放(使い終わったら必ず必要)
	getchar();
	return 0;
}

出力結果
1 2 3 4 5

■配列の複製

(注)クラスのインスタンスの複製をすると、一見複製できたように見えますが、
クラスの中の参照が複製できても、参照先が複製できてないためおかしな結果になります。


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

int main(char* argv[]) {

	int data[]={1,2,3};

	int *ar;
	ar = (int *)malloc(3 * sizeof(int));//動的なメモリの確保 malloc(全体の大きさ)
	if (ar == NULL) return 1;//ポインタがNULLの場合はメモリ確保失敗

	memcpy(ar,data,sizeof(data)); //dataのメモリをarにコピー

	printf("%d %d %d",ar[0],ar[1],ar[2]);

	free(ar);//メモリの開放(使い終わったら必ず必要)
	getchar();
	return 0;
}

出力結果
1 2 3



▲トップページ > Windows と C++