memset_s | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


memset_s関数

概要 指定のメモリアドレスを起点にした一定の範囲内へ、指定の文字を指定文字数だけ書き込む
ヘッダ string.h
形式 errno_t memset_s(void* s, rsize_t smax, int c, rsize_t n);
引数 s 書き込み先の先頭を指すポインタ。ヌルポインタであってはならない。
smax s の領域の要素数。RSIZE_MAX より大きくてはならない。
c 書き込む文字。
n 書き込む文字数。RSIZE_MAX および引数s より大きくてはならない。
戻り値 成功した場合は 0。何らかのエラーが発生したら 0以外。
詳細

引数s で指定したメモリアドレスを起点にして、s + smax に収まる範囲に対して、引数c の値を unsigned char型に変換したものを、引数n で指定した文字数だけ書き込む。


memset関数の安全性を高めた関数である。引数smax が加わったことにより、書き込み先の範囲を明確に示し、その範囲を超えて書き込んでしまう事故を防ぐ。もし範囲を超えた書き込みが起こる状況になったときには実行時制約違反となる。実行時制約違反が起きた場合で、引数s がヌルポインタでなく、引数smax が RSIZE_MAX より大きくなければ、s + smax の範囲内すべてに、引数c の値を unsigned char型に変換したものを書き込む。


また、memset_s関数で書き込みを行う先の領域が、その後まったくアクセスされないようにプログラムが書かれていたとしても、コンパイラは memset_s関数の呼び出しを最適化によって削除しないことが保証される。memset関数にはこのような保証がないため、たとえばパスワードなどの重要な情報が書き込まれた領域を memset関数でクリアしているつもりでも、コンパイラが memset関数の呼び出しを削除してしまい、クリアできない問題が起こることがある。


この関数は、__STDC_LIB_EXT1__ 事前定義マクロが定義されている処理系📘で使用できる。このマクロが定義されていない場合に使用できるかどうかは処理系定義である。また、この関数を使用するのなら、<string.h> をインクルードする前に、__STDC_WANT_LIB_EXT1__ という名前のマクロを、置換結果 1 になるように定義する。このマクロが 0 に置換されると、この関数は宣言・定義されない[1]
注意
使用例
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

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

    if (memset_s(s, sizeof(s), 'x', 5) == 0) {
        printf("%s\n", s);
    }
}

実行結果:

xxxxxfg
関連

memset関数はこの関数の元になった古い関数である。

C23 で memset_explicit関数が追加された。
解説章


参考リンク 🔗

本ページはアフィリエイトプログラムによる収益を得ています。
以下のリンクから商品を購入されると、Programming Place 管理者に紹介料が支払われています。


更新履歴 🔗



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る