memmove関数 - メモリ領域をバイト単位でコピーする

memmove関数は、メモリ領域をバイト単位でコピーする関数です。「string.h」をインクルードします。memcpy関数は、コピー先とコピー元のデータ領域が重なっていた場合には、動作は保証されませんが、memmove関数は保証されます。

#include <string.h>

void *memmove(void *buf1, const void *buf2, size_t n);

第一引数はコピー先のアドレスです。汎用ポインタ型ですので、どのポインタ型でも大丈夫です。

第二引数はコピー元のアドレスです。汎用ポインタ型ですので、どのポインタ型でも大丈夫です。

第三引数にバイトサイズを指定します。size_t型です。int32_t型までの範囲で0以上の数値であれば、まず安心です。0の指定は有効な引数で、この場合コピーは行われません。

文字列をの先頭の文字を削除する

memmove関数で文字列をの先頭の文字を削除するするサンプルです。領域が重なっているのでmemmove関数を使います。strlen関数で文字列の長さを取得しています。

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

int main(void) {
  // 変数名
  const char* var_name = "$foo";
  
  // 変数名の長さ
  int32_t var_name_length = strlen(var_name);
  
  // 変数名をコピー
  char* var_name_alphabet = calloc(var_name_length + 1, sizeof(char));
  memcpy(var_name_alphabet, var_name, var_name_length);
  
  // 変数名をアルファベットの部分だけにする
  memmove(var_name_alphabet, var_name_alphabet + 1, var_name_length - 1);
  var_name_alphabet[var_name_length - 1] = '\0';
  
  printf("%s\n", var_name_alphabet);
  
  free(var_name_alphabet);
}

出力結果です。

foo

関連情報