mem家族(memset和memcpy)

本文详细介绍了memcpy和memset这两个C/C++标准库函数的功能、用法及注意事项,对比了memcpy与strcpy的区别,阐述了如何正确使用memset进行内存初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. mem开头的函数基本上都是对内存操作的,

    它们不管内存里放的是什么数据,只要给出长度,它们就操作。不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。

2. memcpy是内存复制函数

    原型: 

       void * memcpy(void *dest, void const *src, unsigned intlength); 

    功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种方法复制任何类型的值,第3个参数指定复制值的长度(以字节计用sizeof())。

       如果src和dst以任何形式出现了重叠,它的结果是未定义的。

 3. memset函数

     原型:

void * memset(void *a, int val, unsignedint length);

     功能:把从a开始的length个字节都设置为值val。

     例子:memset(buffer, 0, SIZE);

 

Memcpy详解:

结构如下:void *memcpy(void *dest, const void *src,size_t count);

作用:在dest处拷贝src处的字节,并以count来计算需要拷贝的字节数量,进行内存的拷贝。

参数:dest:新的存贮区的开始部位   src:需要拷贝的开始部位   count:需要拷贝的字节数

备注:dest,src,它们都是从各自的地址处进行写入,如果是p而不是&p,那么奖会取得p的值(地址),在该值的地址处进行读出或写入.

memcpy函数的特点是:
       1. 使用memcpy函数前,实参dest必须初始化,否则可能会出错。
       2. 函数原理是将void *src 强制转换为char *s,然后只负责拷贝n个字节到dest里,不负责在最后加上'\0'。

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy


 

memset详解:

void * memset(void*s, int ch, size_t n);

memset:其实是给一段内存初始化。作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法(注意:memset是以字节为单位,初始化内存块。)

函数解释:将s内存中前n个字节并用 ch 替换,该函数返回 s的指针 。

1.为什么要使用memset清零?答:如果不清空,可能会在测试当中出现野值。

2.memset() 函数常用于内存空间初始化。如:
           charstr[100];
           memset(str,0,100*sizeof(char));

       char data[10];  

memset(data, 0, sizeof(data));    // right  

3. memset可以方便的清空一个结构类型的变量或数组。

          如:
           structsample_struct{
                     char csName[16];
                      int iSeq;
                      int iType;
           };

          对于变量:
           structsample_strcut stTest;

          一般情况下,清空stTest的方法:
           stTest.csName[0]='/0';
           stTest.iSeq=0;
           stTest.iType=0;

          用memset就非常方便:
          memset(&stTest,0,sizeof(struct sample_struct));

4.  当结构体类型中包含指针时,在使用memset初始化时需要小心。

比如如下代码中,

struct Parameters {  

               int x;  

                int* p_x;  

};  

Parameters par;  

par.p_x = new int[10];  

memset(&par, 0, sizeof(par));  

当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值