memset函数介绍
描述
C 库函数 void *memset(void *str, int c, size_t n)
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
声明
void *memset(void *str, int c, size_t n)
参数
- str – 指向要填充的内存块。
- c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
- n – 要被设置为该值的字符数。
memset赋值区别
char类型赋值
#include<cstdio>
#include<cstring>
int main()
{
char a[3];
memset(a, 's', sizeof(a));
for(int i = 0; i < 3; i++) {
printf("%c ", a[i]);
}
return 0;
}
输出的结果
int类型赋值
int类型的一般都是赋值0或-1,其他的值都不行。
情况一:
#include<cstdio>
#include<cstring>
int main()
{
int a[3];
memset(a, 0, sizeof(a));
for(int i = 0; i < 3; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出的结果
情况二:
#include<cstdio>
#include<cstring>
int main()
{
int a[3];
memset(a, 10, sizeof(a));
for(int i = 0; i < 3; i++) {
printf("%d ", a[i]);
}
return 0;
}
输出的结果
两次赋值的整数得出的结果不一样,首先得去了解memset的赋值原理:
memset赋值的时候是按字节赋值,是将参数化成二进制之后填入一个字节。就比如前面的例子中,想要通过memset(a,100,sizeof a)给int类型的数组赋值,你给第一个字节的是一百,转成二进制就是0110 0100,而int有四个字节,也就是说,一个int被赋值为0110 0100,0110 0100,0110 0100,0110 0100,对应的十进制是1684300900,根本不是你想要赋的值100,这也就解释了为什么数组中的元素的值都为1684300900。
结论
为地址str开始的n个字节赋值c,注意:是逐个字节赋值,str开始的n个字节中的每个字节都赋值为c。
- 若str指向char型地址,value可为任意字符值;
- 若str指向非char型,如int型地址,要想赋值正确,value的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。
memset初始化为无穷大
memset(a , 0x3f , sizeof(a));
通过memset函数的介绍,上述初始化是将数组a的每个元素赋值为0x3f3f3f3f。0x3f3f3f3f 真的是个非常精巧的常量
他的十进制是 1061109567也就是109级别的,和0x7fffffff一个数量级,0x7fffffff是int类型的最大值,即231-1=2,147,483,647