C 言語での文字列配列のクリア

胡金庫 2023年10月12日
  1. 関数 memset を使って C 言語で文字列配列をクリアする
  2. 関数 bzero または explicit_bzero を用いて C 言語の文字配列をクリアする
C 言語での文字列配列のクリア

この記事では、C 言語で文字列配列をクリアする方法をいくつか説明します。

関数 memset を使って C 言語で文字列配列をクリアする

メモリ領域を定数値で設定するには、一般に memset 関数を使用します。この関数は標準ライブラリの一部であり、<string.h> ヘッダファイルで定義されています。

memset は 3つの引数を取ります。第 1 引数はメモリ領域へのポインタ void であり、第 2 引数は定数バイト値であり、最後の引数は指定したメモリアドレスで満たすバイト数を示します。char 配列をクリアするために 0 整数値を渡すことができることに注意してください。

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

void printCharArray(char *arr, size_t len) {
  printf("arr: ");
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

#define LENGTH 20

int main() {
  char c_arr[LENGTH] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  printCharArray(c_arr, LENGTH);

  memset(c_arr, 0, LENGTH);
  printCharArray(c_arr, LENGTH);

  exit(EXIT_SUCCESS);
}

出力:

arr: a, b, c, d, e, f, g,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
arr:  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,

あるいは、memset は特定の文字を定数バイト引数に指定して呼び出すこともできます。この場合、配列を埋める文字として任意にゼロを選び、結果としてメモリ領域がクリアされます。

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

void printCharArray(char *arr, size_t len) {
  printf("arr: ");
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

#define LENGTH 20

int main() {
  char c_arr2[LENGTH] = "techarmp array";
  printCharArray(c_arr2, LENGTH);
  memset(c_arr2, '0', LENGTH);
  printCharArray(c_arr2, LENGTH);

  exit(EXIT_SUCCESS);
}

出力:

arr: t, e, m, p,  , a, r, r, a, y,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,
arr: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

関数 bzero または explicit_bzero を用いて C 言語の文字配列をクリアする

bzero は、メモリ領域をゼロの \0 バイトで埋めるための別の標準ライブラリ関数です。引数はメモリ領域へのポインタと上書きするバイト数の 2つだけです。一方、explicit_bzero は、コンパイラの最適化に関係なく書き込み操作を保証する代替関数です。ユーザの指示があれば、コンパイラはコードを解析して冗長な命令を削除しますが、explicit_bzero 関数はこの特定のシナリオのために設計されています。

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

void printCharArray(char *arr, size_t len) {
  printf("arr: ");
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

#define LENGTH 20

int main() {
  char c_arr[LENGTH] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  printCharArray(c_arr, LENGTH);

  bzero(c_arr, LENGTH);
  printCharArray(c_arr, LENGTH);

  explicit_bzero(c_arr, LENGTH);
  printCharArray(c_arr, LENGTH);

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Array