Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のメモリ操作とは?主要関数(memcpy・memsetなど)の使い方を解説

C言語におけるメモリ操作とは

C言語には、メモリ領域を直接扱うための標準ライブラリ関数群が用意されています。これらの基本的なメモリ操作関数は #include <memory.h> に含まれており、厳密には文字列関数ではありませんが、そのプロトタイプは #include <string.h> にも宣言されています。

主なメモリ操作関数一覧

void *memchr(const void *s, int c, size_t n);バッファ内から指定した文字を検索します。
int memcmp(const void *s1, const void *s2, size_t n);2つのバッファの内容を比較します。
void *memcpy(void *dest, const void *src, size_t n);あるバッファの内容を別のバッファへコピーします。
void *memmove(void *dest, const void *src, size_t n);指定したバイト数を、あるバッファから別のバッファへ移動します。
void *memset(void *s, int c, size_t n);バッファ内の全バイトを指定した値で埋めます。

コピーは「バイト単位」で行われる

これらの関数でコピー・比較・設定の対象となるのは、あくまで「バイト」単位のメモリである点に注意が必要です。そのため、sizeof() 演算子を組み合わせると非常に便利です。

memcpy(dest, src, SIZE);文字(バイト)配列のコピー
memcpy(idest, isrc, SIZE * sizeof(int));int型配列のコピー

このように、要素サイズが1バイトとは限らないデータ型を扱う場合は、sizeof() を掛けることで必要なバイト数を正しく指定できます。

memmove() と memcmp() の特徴

memmove()memcpy() とまったく同じように動作しますが、コピー元とコピー先のメモリ領域が重なっていても正しく処理できる点が異なります。領域が重なる可能性がある場合は、安全のために memmove() を使用しましょう。

memcmp()strcmp() に似ていますが、こちらは文字列ではなく符号なしバイト同士を比較します。戻り値は、s1 が s2 より小さければ 0 未満、等しければ 0、大きければ 0 より大きい値となります。

使用例

char src[SIZE], dest[SIZE];
int isrc[SIZE], idest[SIZE];

/* 文字配列(バイト列)のコピー */
memcpy(dest, src, SIZE);

/* int型配列のコピー */
memcpy(idest, isrc, SIZE * sizeof(int));

/* バッファ全体を0で初期化 */
memset(dest, 0, SIZE);

まとめ

C言語のメモリ操作関数を使いこなすことで、文字列に限らない任意のデータ(構造体や配列など)を効率的にコピー・比較・初期化できます。特に memcpy()memmove() の違い(領域の重なりへの対応)や、sizeof() を使ったバイト数の計算は実務でも頻出のポイントなので、しっかり押さえておきましょう。

  1. C言語のポインタとは?基本の使い方と9種類のポインタ演算を徹底解説

    ポインタとはポインタ(pointer)とは、別の変数のアドレス、すなわちメモリ上の格納位置を直接指し示す値を持つ変数のことです。通常の変数や定数と同様に、ポインタも変数のアドレスを格納する前に必ず宣言しておく必要があります。まず、次の文を見てみましょう。int qty = 179;この変数はメモリ上で以下のように表現されます。ポインタは次のように宣言します。int *p;これは「p は別の int 型変数のアドレスを保持するポインタ変数である」という意味です。アドレス演算子(&)による初期化ポインタ変数は、アドレス演算子「&」を使って初期化します。int qty = 175;i

  2. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ