目录

1、std::memset()

(1)简单应用案例

(2)在二维数组中的应用

(3)在数组中清零

(4)结构体清零

2、std::fill()

3、std::memset()和 std::fill()的区别

std::memset()‌:

std::fill()‌:


1、std::memset()

        功能:将一块内存空间的每个字节都设置为指定的值,这个函数通常用于初始化一个内存空间,或者清空一个内存空间。

示例:

   void* memset(void* ptr, int value, size_t num);
·  ptr:指向要设置数值的内存起始位置的指针。
·  value:要设置的无符号字符值(通常是 unsigned char 类型的)。
·  num:要设置的字节数。

(1)简单应用案例

例如:想要将一个字符数组中的字符全设为 a。

char c[10];
memset(c, 97, sizeof(c));
for (int i = 0; i < 10; ++i)
{
	std::cout << c[i] << " ";
}

输出:

a a a a a a a a a a

解释:97 对应的二进制是 0110 0001,memset 将 c 的每一个字节都设为了 0110 0001,而 97(0110 0001)对应的字符为 a,所以 c 中的元素输出出来都是 a。
  所以在设置字符串时,想要设置成什么字符,只要在 vaule 处填写对应 ascll 码值即可。

        注意:memset () 一般用在字符数组中,在设置整形或者其他的类型时(例如:结构体)时,一般只能设置成 0 或者 -1。

例如:如果想要用 memset 设置 int 的值为 1,此时如果你写下下面这段代码:

int a[10];
memset(a, 1, sizeof(a));
for (int i = 0; i < 10; ++i)
{
	std::cout << a[i] << " ";
}

输出:

16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009

        输出结果并不是想要的 1 而是 16843009,这是因为 1 对应的二进制是 0000 0001 ,int 占四个字节,每个字节都被填充为 0000 0001,则数组中的每一个数被设置为 0000 0001 0000 0001 0000 0001 0000 0001,这个数对应的十进制值为 16843009。

(2)在二维数组中的应用

memset 在二维数组中的用法:

示例:

int a[10][10];
memset(a, 0, sizeof(a));
for (int i = 0; i < 10; ++i)
{
	for (int j = 0; j < 10; ++j)
	{
		std::cout << a[i][j] << " ";
	}
	std::cout << endl;
}

输出:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

(3)在数组中清零

         整型数组清零或置 -1

int arr[10];
memset(arr, 0, sizeof(arr));    // 所有元素初始化为 0
memset(arr, -1, sizeof(arr));   // 所有元素初始化为 -1

(4)结构体清零

struct Point { int x; int y; };
Point p;
memset(&p, 0, sizeof(p));    // 所有成员变量置 0

2、std::fill()

  std::fill() 是 C++ 标准库中的一个函数,定义在 <algorithm> 头文件中;

  std::fill()作用:它用于将指定的值赋给一个给定范围内的所有元素,常用于数据结构初始化。

#include <algorithm> // 包含 std::fill
#include <vector>
 
int main() 
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::fill(vec.begin(), vec.end(), 0);     // 将 vec 中的所有元素设置为 0
    return 0;
}

3、std::memset()和 std::fill()的区别

std::memset()‌:

(1)、直接操作内存字节,将目标区域的每个字节设置为指定值(强制转换为unsigned char),不感知数据类型。例如,对int数组赋非 0/-1 值会导致数据异常(如赋 会生成0x01010101)。

(2)、仅适用于‌POD类型‌(如基本类型、无虚函数的结构体),对非POD类型(如类对象)使用会破坏内存布局(如虚表指针)。

(3)、仅能安全赋 0-1 或 特定字节值(如0x3f表示无穷大);性能更高(直接内存操作),适合大规模POD类型初始化。

std::fill()‌:

(1)、基于迭代器操作,调用元素的赋值运算符,按对象类型初始化,支持任意值且类型安全;

(2)适用于所有类型(包括容器和类对象),支持复杂数据结构的初始化;

(3)、可赋任意值(如自定义对象或非字节对齐值)。性能略低(需调用赋值操作),但更通用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐