C言語編 リファレンス

標準ライブラリ 「M」

「M」で始まる標準ライブラリ関数及び、その他の定義です。

malloc関数

概要 メモリ領域を割り当てる(アロケートする)。
必要なヘッダファイル stdlib.h
形式 void* malloc(size_t size);
引数 size アロケートする領域の大きさをバイト単位で指定する。
0 を指定した場合の動作は環境依存。
戻り値 アロケートされた領域の先頭を指すポインタ。 メモリ不足などの要因で失敗した場合には、NULL が返される。
詳細 アロケートされた領域が不要になったら、free関数で解放(システムへ返却)することができる。
システムがメモリ領域を管理するための追加の領域が必要なため、実際に割り当てられる大きさは、size を超える可能性がある。
注意 割り当てられた領域の状態は不定であり、クリアされるかどうかも、以前の状態が残っているかどうかも保証できない。
calloc関数を使えば、確実にゼロクリアされた領域を得られる。
使用例
#include <stdio.h>
#include <stdlib.h>

#define ALLOCATE_SIZE	(10)

int main(void)
{
	int* values;
	int i;
	
	values = malloc( sizeof(int) * ALLOCATE_SIZE );
	if( values == NULL ){
		exit( EXIT_FAILURE );
	}

	for( i = 0; i < ALLOCATE_SIZE; ++i ){
		values[i] = i;
	}

	for( i = 0; i < ALLOCATE_SIZE; ++i ){
		printf( "%d\n", values[i] );
	}

	free( values );

	return 0;
}

実行結果:

0
1
2
3
4
5
6
7
8
9
関連 ゼロクリアされた領域は calloc関数で得ることができる。 また、realloc関数は領域の再割り当てを行う。
本編で解説している章 第34章

MB_CUR_MAX

概要 現在のロケール設定において、マルチバイト文字1文字の最大バイト数。
必要なヘッダファイル stdlib.h
形式 #define MB_CUR_MAX 2
置換結果 現在の LC_CTYPE によって指定されるロケールにおいての、 マルチバイト文字1文字を表すのに必要な最大バイト数。
詳細
注意 現在のロケールに依存するので、考え得る最大サイズを表してはいない。 全てのロケールを含めたときの最大サイズは、MB_LEN_MAX で得られる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char* argv[])
{
	setlocale( LC_CTYPE, "jpn" );
	printf( "%d\n", MB_CUR_MAX );

	setlocale( LC_CTYPE, "usa" );
	printf( "%d\n", MB_CUR_MAX );

	return 0;
}

実行結果:

2
1
関連 全てのロケールを合わせた場合の最大サイズは、MB_LEN_MAX が表現する。
本編で解説している章 第46章

MB_LEN_MAX

概要 全てのロケール設定で、マルチバイト文字1文字を表すために必要なバイト数。
必要なヘッダファイル stdlib.h
形式 #define MB_LEN_MAX 5
置換結果 どのロケール設定においても、マルチバイト文字1文字を表現するために必要十分なバイト数。
詳細
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char* argv[])
{
	setlocale( LC_CTYPE, "jpn" );
	printf( "%d\n", MB_LEN_MAX );

	setlocale( LC_CTYPE, "usa" );
	printf( "%d\n", MB_LEN_MAX );

	return 0;
}

実行結果:

5
5
関連 現在のロケールだけを考慮した値が必要ならば、MB_CUR_MAX を使う。
本編で解説している章 第47章

mblen関数

mbtowc関数

mbstowcs関数

memchr関数

概要 メモリ上から、特定の文字を探す。
必要なヘッダファイル string.h
形式 void* memchr(const void* s, int c, size_t n);
引数 s 対象のメモリアドレス。
c 探す文字。
n 検索するバイト数。
戻り値 発見された場合は、メモリ上の文字c のアドレス。
発見できなかった場合は NULL。
詳細 アドレスs のから検索を行い、引数c を unsigned char型にキャストしたものと一致する文字を探す。
注意 検索対象のアドレスs は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている領域を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	const char str[] = "abc\0def";
	char* p;

	p = memchr( str, 'd', sizeof(str) );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		puts( p );
	}

	return 0;
}

実行結果:

def
関連 文字列からの検索に特化した strchr関数がある。
C95以降では、メモリ上からワイド文字を検索する wmemchr関数がある。
本編で解説している章

memcmp関数

概要 2つのアドレスを起点に、それぞれ指定サイズ分のデータを比較する。
必要なヘッダファイル string.h
形式 void* memcmp(const void* s1, const void* s2, size_t size);
引数 s1 比較対象の先頭アドレス。
s2 比較対象の先頭アドレス。
size 比較するバイト数。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
詳細 2つの起点アドレスを元に、一定のバイト数の範囲を比較する。
この比較は、メモリ上のデータを 1バイト単位で文字とみなして調べることで行われる。 従って、終端文字('\0') で終了しない点を除けば、処理内容は strcmp関数と変わらない。
注意 構造体のメンバ間には、コンパイラによって、パディング(詰め物)が挿入される可能性があるので、 構造体変数同士を比較するような目的で、この関数を使用することは間違いである。 構造体変数同士の比較は、各メンバを個別に ==演算子で調べるのが正しい。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[] = "abc\0de";
	char s2[] = "ab\0c";
	char s3[] = "abcdef";

	printf( "%d\n", memcmp(s1, s1, sizeof(s1)) );
	printf( "%d\n", memcmp(s1, s2, sizeof(s1)) );
	printf( "%d\n", memcmp(s1, s3, sizeof(s1)) );

	return 0;
}

実行結果:

0
1
-1
関連 適切に終端文字('\0') が存在し、途中に登場することも無い、ごく普通の文字列同士の比較であれば、 strcmp関数を使えば良い。
また、C95以降では、ワイド文字とみなして同様の処理を行う wmemcmp関数が存在する。
本編で解説している章

memcpy関数

概要 あるアドレスを起点に、一定のサイズのデータを、別のアドレスへコピーする。
必要なヘッダファイル string.h
形式 void* memcpy(void* s1, const void* s2, size_t size);
引数 s1 コピー先の先頭アドレス。
s2 コピー元の先頭アドレス。
size コピーするバイト数。
戻り値 s1 と同じアドレスが返される。
詳細 strcpy関数とは異なり、'\0' の影響を受けない。
注意 コピー先の範囲と、コピー元の範囲が重なり合っている場合の結果は未定義である。 重なり合う場合には、memmove関数を使えば良い。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[] = "abcdefg";
	char s2[] = "xyz";

	printf( "%s\n", memcpy( s1, s2, sizeof(s2)-1 ) );

	return 0;
}

実行結果:

xyzdefg
関連 コピー先範囲とコピー元範囲が重なり合う場合は、memmove関数を使う。 文字列のコピーならば、strcpy関数strncpy関数が使える。
また、C95以降では、ワイド文字とみなして同様の処理を行う wmemcpy関数が存在する。
本編で解説している章

memmove関数

概要 あるアドレスを起点に、一定のサイズのデータを、別のアドレスへコピーする。
必要なヘッダファイル string.h
形式 void* memmove(void* s1, const void* s2, size_t size);
引数 s1 コピー先の先頭アドレス。
s2 コピー元の先頭アドレス。
size コピーするバイト数。
戻り値 s1 と同じアドレスが返される。
詳細 strcpy関数とは異なり、'\0' の影響を受けない。
memcpy関数とは異なり、コピー先範囲とコピー元範囲が重複していても動作する。 memmove関数の方が安全だが、通常、memcpy関数の方が高速なはずである。
注意
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[] = "abcdefg";

	printf( "%s\n", memmove( &s1[0], &s1[3], 4 ) );

	return 0;
}

実行結果:

defgefg
関連 コピー先範囲とコピー元範囲が重なり合わない場合は、memcpy関数が使える。 文字列のコピーならば、strcpy関数strncpy関数が使える。
また、C95以降では、ワイド文字とみなして同様の処理を行う wmemmove関数が存在する。
本編で解説している章

memset関数

概要 あるアドレスを起点に、一定の範囲の各バイトに、特定の値を設定する。
必要なヘッダファイル string.h
形式 void* memset(void* s, int c, size_t size);
引数 s 設定先の先頭アドレス。
c 設定する値(文字)
size 設定するバイト数。
戻り値 s と同じアドレスが返される。
詳細 設定する値を指定する引数c は、int型であるが、実際には 1バイトの値でなければならない。 その値が、指定範囲内のすべての領域に設定される。
注意
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[] = "abcdefg";

	printf( "%s\n", memset( s1, 'x', 5 ) );

	return 0;
}

実行結果:

xxxxxfg
関連 calloc関数は、malloc関数と memset関数の組み合わせであると考えられる。
また、C95以降では、ワイド文字とみなして同様の処理を行う wmemset関数が存在する。
本編で解説している章

mktime関数

参考リンク

更新履歴

'2010/9/19 MB_CUR_MAXマクロ、MB_LEN_MAXマクロの説明を追加。

'2010/5/19 memchr関数の説明を追加。

'2009/12/24 memcmp関数、memcpy関数、memmove関数、memset関数の説明を追加。

'2009/12/17 malloc関数の説明を追加。

'2009/8/20 新規作成。



リファレンスのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ