memset()函数的用法详解

博客探讨了使用memset函数为数组赋值时出现的意外情况。memset在赋值时按字节操作,因此当尝试为非字符类型如int赋值时,可能导致非预期结果。例如,赋值100给int数组会得到1684300900,因为100的二进制形式不匹配int的字节数。文章指出,memset适合赋值0或-1,以确保所有位都被设置。此外,还展示了如何使用memset初始化数组为特定值,如无穷大表示的0x3f3f3f3f。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

前言

最近做题时突然想到用memset给数组的元素赋值100,但是发现结果和想象中的不一样
在这里插入图片描述
通过debug看到数组中的元素的值都为1684300900,而明明给它的是100,这是为什么呢,于是查阅了一下memset函数的用法和原理

memset()函数介绍

首先来看函数原型

void *memset(void *str, int c, size_t n)
  • 解释:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
  • 作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
  • 头文件:C中#include<string.h>,C++中#include<cstring>

看着介绍其实函数作用非常简单,就是用于初始化,但是需要注意的是memset赋值的时候是按字节赋值,是将参数化成二进制之后填入一个字节。就比如前面的例子中,想要通过memset(a,100,sizeof a)给int类型的数组赋值,你给第一个字节的是一百,转成二进制就是0110 0100,而int有四个字节,也就是说,一个int被赋值为
0110 0100,0110 0100,0110 0100,0110 0100,对应的十进制是1684300900,根本不是你想要赋的值100,这也就解释了为什么数组中的元素的值都为1684300900。

memset赋值时只能赋值为0?

答案肯定不是,比如任意字符都是可以的,初始化成0是最常用的。int类型的一般都是赋值0或-1,其他的值都不行。

结论
为地址str开始的n个字节赋值c,注意:是逐个字节赋值,str开始的n个字节中的每个字节都赋值为c。
(1) 若str指向char型地址,value可为任意字符值
(2) 若str指向非char型,如int型地址,要想赋值正确,value的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。

举例:给数组赋值-1

int A[2];  
memset(A, -1, sizeof A);  

在这里插入图片描述

memset初始化为无穷大

memset(a , 0x3f , sizeof a);

通过memset函数的介绍,上述初始化是将数组a的每个元素赋值为0x3f3f3f3f。0x3f3f3f3f 真的是个非常精巧的常量
他的十进制是 1061109567也就是109级别的,和0x7fffffff一个数量级,0x7fffffff是int类型的最大值,即231-1=2,147,483,647。

本文章已经生成可运行项目
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weiambt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值