C++のmemset関数とは?使い方と注意点をわかりやすく解説
memset()関数の概要
この記事では、C++におけるmemset()関数の役割と使い方について詳しく解説します。memset()関数は、指定した文字の値をunsigned char型に変換し、str[]が指すオブジェクトの先頭n文字分にその値をコピーする関数です。
なお、nが文字列のサイズより大きい場合、動作は未定義(undefined behavior)となるため注意が必要です。
memset()関数の構文
void* memset( void* str, int c, size_t n);
引数の意味は以下の通りです。
- str:値を設定する対象のメモリ領域へのポインタ
- c:設定する値(unsigned char型に変換されます)
- n:設定するバイト数
基本的な使用例
まずは文字列に対して、先頭からn文字分を別の文字に置き換える例を見てみましょう。
#include<bits/stdc++.h>
using namespace std;
int main() {
char str[] = "Hello World";
memset(str, 'o', 6); // n = 6 を指定
cout << str;
}出力結果
ooooooWorld
この例では、文字列「Hello World」の先頭6文字がすべて「o」に書き換えられ、「ooooooWorld」という結果になっています。
配列の初期化に使う際の注意点
memset()は、すべての値を0または-1に設定する用途でよく使われます。しかし、それ以外の値を設定することはできません。その理由は、memset()がバイト単位で動作するためです。
次の例で、この挙動を確認してみましょう。
#include<bits/stdc++.h>
using namespace std;
int main() {
int array[10];
memset(array, 0, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
memset(array, -1, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
memset(array, 3, sizeof(array));
for(int i = 0; i<10; i++){ cout << array[i] << " "; }
cout << endl;
}出力結果
0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027 50529027
なぜ0と-1だけが正しく機能するのか
0の場合、すべてのバイトが0になればint型としても0になります。また、-1の場合は2の補数表現により、すべてのバイトが0xFFになるため、int型としても-1を表します。
一方、3を設定した場合、各バイトには0x03が書き込まれます。32ビットのint型では4バイト分が「03 03 03 03」となり、16進数で0x03030303、つまり10進数で50529027という予想外の値になってしまうのです。
まとめ
memset()関数はメモリ領域を高速に初期化できる便利な関数ですが、バイト単位で動作する特性上、0や-1以外の値でint型などのマルチバイト型の配列を初期化する目的には使用できません。そのような場合は、std::fill()やループによる代入など、要素単位で値を設定する方法を使いましょう。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の