当前位置: 代码迷 >> 综合 >> memset函数、0x3f、INF、memcpy
  详细解决方案

memset函数、0x3f、INF、memcpy

热度:76   发布时间:2023-11-25 23:00:17.0

定义:

例子:

初始化为1的后果:

初始化为-1的正确示范 

0x3f

INF

定义:

memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。

 其原型是:void* memset(void *_Dst, int  _Val, size_t _Size)

_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数

例子:

我们用memset给str初始化为“000000000”,用法如下

       char str[9];

       memset(str,'0',9); 

      for(int i=0;i<9;i++) cout<<str[i];

注意,memset是逐字节 拷贝的。

我们用memset给str初始化为{1,1,1,1,1,1,1,1},

       int num[8];      

       memset(num,1,8);//这样是不对的

     一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。

因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

初始化为1的后果:

初始化为-1的正确示范 

 所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。

#include <memory.h> 
#include <stdio.h> void main( void )  
{  char buffer[] = "This is a test of the memset function";  printf( "Before: %s\n", buffer ); memset( buffer, '*', 4 ); printf( "After: %s\n", buffer ); }  
输出:  
Before: This is a test of the memset function  
After: **** is a test of the memset function 

0x3f

如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用memset函数而得自己写循环了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0(一般我们只有赋值为-1和0的时候才使用它)。现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

INF

#define INF 0x3f3f3f3f 

memcpy

memcpy函数是C/C++语言中的一个用于内存复制的函数,声明在 string.h 中(C++是 cstring)。其原型是:

void *memcpy(void *destin, void *source, unsigned n);

作用是:以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。
函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度。