将s所指向的某一块内存中的每个字节(八位二进制数)的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。
void *memset(void *s,int ch,size_t n);
函数解释:将 s 中前 n 个字节用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
函数解释:将 s 中前 n 个字节用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
常见错误:
1.
其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现
int some_func(struct something *a){
…
…
memset(a,0,sizeof(a));
…
}
这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something* 指针类型大小的的字节数,如果是32位,就是4字节。
int some_func(struct something *a){
…
…
memset(a,0,sizeof(a));
…
}
这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something* 指针类型大小的的字节数,如果是32位,就是4字节。
2.
特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)
3.
如下程序想把数组中的元素值设置成1,却是不可行的
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a[5];
memset(a,1,5);//如果这里改成memset(a,1,5 *sizeof(int))也不可以,因为memset按字节赋值。
for(int i = 0;i < 5;i++)
cout<<a[i]<<" ";
system("pause");
return 0;
}
答:
⒈因为第一个程序的 数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?
⒉如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)
就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4 字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了
⒈因为第一个程序的 数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?
⒉如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)
就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4 字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了