はじめに
動的な領域確保方法を知っていると
作れるプログラムの幅が広がります。
ここれは、動的な領域確保
領域のクリア及び解放法を記載します。
関数一覧
動的な領域確保
書式:
#include <stdlib.h>
void *malloc(size_t size);
パラメータ:size_t size 確保するバイト数
戻り値 :成功時:確保した領域のポインター
失敗時:NULL
説明:
malloc関数はsize分のバイト数を割り当てます。
戻り値としては、確保した領域のポインターを返します。
確保に失敗した場合は、NULLを返す。
動的な領域解放
書式:
#include <stdlib.h>
void free(void *ptr);
パラメータ:ポインターptrが指すメモリー空間を開放する。
説明:
基本的にはmallocで取得したポインタを設定して開放する。
解放忘れなどの場合は、領域確保されたままなので
「メモリリーク」が起きてプロセスが落ちます。
指定したバイト数でメモリー領域にセットする
書式:
#include <string.h>
void *memset(void *s, int c, size_t n);
パラメータ:
void *s:セットする領域
int c :セットする値
size_t n:設定するバイト数
説明:
セットする領域(*s)にcをnバイト数設定する。
メモリー領域をコピー
書籍:
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
パラメータ:
void *dest :コピー先の領域
const void *src:コピー元の領域
size_t n :コピーするバイト数
説明:
コピー元のメモリー領域 src の先頭 n バイトを
コピー先のメモリー領域 dest にコピーする。
コピー元の領域と コピー先の領域が重なってはならない。
サンプル
領域確保~解放までのサンプル
sigu@sigu-desktop:~/work$ cat test_c.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
char *ss=NULL;
ss =(char *)malloc(64); //64バイトの領域を確保
if(ss==NULL)
{
printf("no mem\n");
return 1;
}
else
{
printf("mem:%p\n",ss); //ポインタのアドレスを表示
memset(ss,0x0,64); //64バイトを0クリア
printf("%s\n",ss); //初期化されているか確認
memset(ss,0x41,32); //今度は32バイト分Aを設定する
printf("%s\n",ss);
ss[0]='a'; //先頭1バイトにaを設定する
printf("%s\n",ss);
}
free(ss); //最後に領域を解放する
printf("First compiler\n");
return 0;
}
コメント