关于函数memset的若干用法和注意事项

时间:2023-01-21 19:20:33

        

    #include<memory.h>或<string.h> //在一些编译器中可不添加头文件,视具体情况而定   
void* memset(void *s, int ch, size_t n);

  • memset将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。
  • 它是对较大的结构体或数组进行清零操作的一种最快方法。
  • 不能对非单字节的数组进行赋值,除非是赋0值,比如:
    int array[16];
memset(array, 1, sizeof(int) * 16); //error, sizeof(int)为4
memset(array, 0, sizeof(int) * 16); //ok
  • 事实上,第一种操作会使得数组的每个元素都变为(00000001 00000001 00000001 00000001) = 16843009,但第二种操作是没有问题的,因为把每个字节赋为0后,其值也是0。因此,下面的操作没有任何问题:
    char ch[16];
bool bl[16];
memset(ch, 'A', sizeof(char) * 16);
memset(bl, true, sizeof(bool) * 16);
  • 甚至可以对只含有单字节的结构体赋值:
    struct strc
{
bool bl;
char ch;
};
strc array[16];
memset(array, 1, sizeof(strc) * 16);
  • 因此,memset用于对任意数组进行初使化(仅限赋0),以及对只含单字节元素的数组进行赋值。