memset函数介绍

  • 简介: memset是以字节为单位对一块内存进行初始化的,在c中位于头文件<string.h>中,c++位于头文件
  • 函数原型: void *memset(void *s, int c, unsigned long n); 对以s为首地址的n个字节大小的内存,每个字节初始化成c
  • 用法: 常常是对结构体或者数组进行初始化,速度更快效率更高
  • 注意点: memset是以字节为单位对一块内存进行初始化的,这个地方很容易出错的

memset具体用法

1.若s指向char型的地址组则c可以为任何值都不会出问题(因为memset是按字节进行初始化的,而char类型占一个字节大小,所以没问题)

#include <iostream>
#include <cstring>
using namespace std;
char str[10];
int main(void) {
    memset(str, '*', sizeof(str));
    for (int i = 0; i < 10; i++) {
        cout << str[i] << " ";
    }
    return 0;
}
//运行结果* * * * * * * * * *, 若c改成'1'则结果就是1 1 1 1 1 1 1 1 1 1

2.若s指向int类型的数组则c不能为任何值, 一般c为0x3f,-1,0。当为0x3f时值为0x3f3f3f3f;当为-1时值为-1;当为0时值为0;

特别注意c为1的时候结果不为1因为memset是按字节为单位进行初始化的所以每个字节都为00000001,那么4个字节的int大小就为00000001000000010000000100000001
结果为16843009不符合我们的期望这个地方很容易出错,memset对于非char类型的地址进行初始化一定要慎重思考,考虑memset按字节赋值,判断是否与我们预期相同,
-1跟0x3f还有0都没有问题

#include <iostream>
#include <cstring>
using namespace std;
int arr[10];
int main(void) {
    memset(arr, 1, sizeof(arr));
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}
//结果为16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009