当前位置:   article > 正文

memset和memset_s

memset_s

void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的 结构体 或 数组 进行清零操作的一种最快方法
代码示例:
float stretch_p[256], stretch_p1[256], stretch_num[256];
//清空三个数组,初始化填充数组元素为0
memset(stretch_p, 0, sizeof(stretch_p));
memset(stretch_p1, 0, sizeof(stretch_p1));
memset(stretch_num, 0, sizeof(stretch_num));

errno_t memset_s(void * dest,rsize_t destsz,int ch,rsize_t count)
运行时检测到以下错误,并且如果dest和destsz本身有效,则在将ch存储到目标范围[dest,dest + destsz)的每个位置之后调用当前安装的约束处理函数:
dest 是一个空指针
destsz或count大于RSIZE_MAX
count大于destsz(会发生缓冲区溢出)
如果由dest <count <= destsz指向的字符数组的大小,行为是未定义的; 换句话说,destsz的错误值不会暴露即将发生的缓冲区溢出。 作为所有边界检查函数,只有当__STDC_LIB_EXT1__由实现定义时,以及在包含string.h之前用户将__STDC_WANT_LIB_EXT1__定义为整数常量1时,memset_s才能保证可用。
sext-指向要填充的对象的指针
ch-填充字节
count-要填充的字节数
destsz-目标数组的大小

返回值
1) dest 副本
2)成功时为零,错误时为非零。 同样出错的是,如果dest不是空指针并且destsz有效,那么将destsz填充字节ch写入目标数组。

注意
如果此函数修改的对象在其余生命期内(例如,gcc bug 8537)不再被访问,则memset可能会被优化(在as-if规则下)。 因为这个原因,这个函数不能用来擦洗内存(例如,填充一个存储密码为零的数组)。 memset_s禁止这种优化:保证执行内存写入。 第三方解决方案包括FreeBSD explicit_bzero或Microsoft SecureZeroMemory。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/311734?site
推荐阅读
相关标签
  

闽ICP备14008679号