关于C语言中的memset()函数你了解多少

665a0afd52dab2c6cb230760da6b82ac.png

点击上方蓝字关注我,了解更多咨询

0b96702937f0ecf954bddb144247d7ad.png

1.函数原型及功能

memset()函数原型为:

cea206b7bc6f970fe86fb008b29ed46a.png

函数功能:将_Dst所指区域的前size_t个字节均初始化为_val,调用时需要引用string.h头文件

memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始化,如果没有对其进行初始化,常常会产生一些野值。

此外,读者可能对_cdcel和size_t比较陌生,这里稍微解释下,其中_cdecl表示C/C++和MFC程序默认使用的调用约定:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。(这里不详细说明,后续会写一篇关_cdecl、_stdcall、_fastcall的文章,读者可去我的主页查看),size_t是宏定义unsigned int或unsigned _int64的替换体

2.使用memset()函数

2.1 用memset()函数给数组初始化

f20bc82fa1f6aa4047455d3ec98b09a4.png

结果为:

f9794af35b1d41392086cf1639b0b19c.png

memset 一般使用0初始化内存单元,需要注意的是,memset()函数是对size_t个字节进行赋值,而int类型为4个字节,如果写成这样便是错误的:

d7e3f6759d76c1c0ad281b982db78ae4.png

正确写法为:

c82a6d519240a4f6b9d9dab65ec294b6.png

这等价于例中的写法

2.2 用memset()函数给结构体初始化

4873516d410116bee3eef43abdc95e57.png

通过memset()函数初始化要比挨个对结构体中成员初始化要方便很多。

如果是对结构体数组初始化的话:

44debde3e11783ecec818cbbbb23c3ad.png

3.容易忽视的错误

错误1:sizeof(指针)

先来看一个例子:

c274791368575b3c1596928af56da8aa.png

大家觉得结果是什么?是“0 0 0 0 0 0 0 0 0 0”吗?

错误,结果应该是:

9725c34c184e8a70a33f8992d5331161.png

为什么会这样?因为str是指针变量,无论str指向的是什么类型的变量,str终究只是存储了地址,sizeof(str)永远等于4!所以我们只将前面4个字节置为0,而后面的-52应该是乱码的表示,因为后面六个字节是没有初始化的(关于-52知道的读者可以在评论区留言

我们平常可以通过指针或数组名来操控数组元素的值,如str[i],a[i],*(str+i)都是正确的写法,但务必记住的是指针和数组名不完全相同,具体区别我会另写一篇文章讲解。

错误2:多字节类型变量赋非0值与想像的不同

还是来看一个例子:

0c006af119f7bfaba50447ee081ac8c0.png

大家觉得结果是什么呢?是“1 1 1 1 1 1 1 1 1 1”吗?

正确答案为:

2a9fe7aa8bbd97f864c9137ecaf01d9d.png

memset()函数赋值时,是对数组b的每个字节赋值,所以每个数组元素的值为:

3367d63d17510ee5e8cd0522b66726f7.png

转换为10进制便是16843009

c944e8829479428c0b48750946bb8013.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

49b21501d6e0e9f8d3c737c6f0861b82.png

7456f2f9d6dbd7e95d38468b38eee24e.gif

戳“阅读原文”我们一起进步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值