memset函数

C/C++3周前发布 3153917921
5 0 0

memset 函数是 C/C++ 标准库中的一个函数,用于设置内存块的值。它的原型在 <string.h>(或 <cstring> 在 C++ 中)中定义如下:

void *memset(void *s, int c, size_t n);
  • s 是指向要设置的内存块的指针。
  • c 是要设置的值。这个值会被转换为一个无符号字符(unsigned char)并复制到内存块中。
  • n 是要设置的字节数。

为什么用memset初始化1时不准确?

  1. 按字节赋值memset 函数是按字节(byte)对内存进行赋值的。它接收一个整数 c 作为参数,但实际上只使用该整数的低 8 位(一个字节)来填充目标内存区域。这意味着,不论你传入什么整数,只有其低 8 位会被用于赋值。
  2. 整数与字节的关系:对于整数类型(如 int),它们通常占据多个字节(在现代系统中,int 通常是 4 个字节,即 32 位)。当你试图用 memset 将一个整数数组初始化为 1 时,你实际上是在告诉 memset 将每个字节都设置为 1 的二进制表示(即 00000001)。
  3. 整数表示:在内存中,整数是以二进制补码的形式存储的。当你将一个整数的所有字节都设置为 00000001 时,这并不意味着该整数的值是 1。实际上,对于一个 4 字节的整数,如果所有字节都是 00000001,那么其二进制表示是 00000001 00000001 00000001 00000001,对应的十进制值是 16843009(计算方法是 1×(2^0) + 1×(2^8) + 1×(2^16) + 1×(2^24))。
  4. 特殊值的情况:对于 0 和 -1,情况有些特殊。0 的二进制表示是全零(00000000 00000000 00000000 00000000),所以使用 memset 初始化为 0 时没有问题。对于 -1,在二进制补码表示中,它的所有位都是 1(例如,对于一个 4 字节的整数,其表示是 11111111 11111111 11111111 11111111)。因此,当使用 memset 将内存块初始化为 -1 时,效果也是正确的。
© 版权声明

相关文章

暂无评论

暂无评论...