Memset、Memcpy、Strcpy 的作用和区别(转)

内存操作函数之memset和memcpy memset函数 包含头文件:string或者memory extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, count:是buffer的长度. 这个函数在socket中多用于清空数组. 如:原型是memset(buffer, 0, sizeof(buffer)) Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’; 例:cha 阅读详情

(1) Memset
  原型:   extern void *memset(void *buffer, int c, int count);              
  用法:  #include <string.h>           

   功能: 把buffer所指内存区域的前count个字节设置成字符 c。           
  说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符
              例如:     
                    char a[10];                        
                    memset(a, '\0', sizeof(a));               
        memset可以方便的清空一个结构类型的变量或数组。               
             如:struct    _test{  char s[10];      
                                          int x;      
                                          int y;
                                        };        
    变量     struct _test    st;              
(1)一般清空st的方法如下:
st.s[0] = '\0'; st.x =0;   st.y =0;               
(2) 用memset方法如下:               
             memset(&st,0,sizeof(struct _test));         
    数组:  struct _test     st[10];               
  memset(st,0,sizeof(struct _test)*10);  //清空方法
//memset 源码的实现 C语言
#include <mem.h>
void* memset(void* s, int c, size_t n)
{
     unsigned char* p = (unsigned char*) s;

     while (n > 0)
       {
               *p++ = (unsigned char) c;
                --n;
       }

      return s;
  }



(2)memcpy
原型:extern void *memcpy(void*dest,void*src,unsignedintcount);              用法: #include <string.h>              
功能: 由src所指内存区域复制count个字节到dest所指内存区域。            
说明: src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。   
             例如:  char a[10],b[5];              
                        memcpy(b, a, sizeof(b));             /*注意如果用sizeof(a),会造成b的内存地址溢出*/
(3) Strcpy   
    原型: extern char *strcpy(char *dest,char *src);                  
    用法: #include <string.h>                    
    功能: 把src所指由NULL结束的字符串复制到dest所指的数组中。               
    说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳 src的字符串.返回指向dest的指针。                    
               例如:   char a[100],b[50];
                          strcpy(a,b);
                 如用   strcpy(b,a);
  要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
    假如有如下代码,请问输出为多少?
            #include "stdio.h"
            main()
                {  char dest[3];
                    char str[6]="Hello";

               strcpy(dest,str);
                    printf("%s\n",dest);

              }
        编译输出如下结果:
        Hello                  //没有输出乱码,有点怪怪的为什么?
       分析:
             1>str中字符串的长度大于dest 的内存长度3.为什么str字符串还能完拷贝到dest 中呢?
      来看看 strcpy的 源代码实现:
char   *strcpy(char   *strDest,const   char   *strSrc)   
{   
        assert((strDest!=NULL)&&(strSrc   !=NULL))   //判断指针是否合法,即分配内存,指向某块确定区域
        char   *address   =   strDest;               //记住目标地址的起始值
        while((*strDest++   =   *strSrc++)!='\0')   //先拷贝,后判断,这样就不用在拷贝完了后,再加一句
              NULL;                   // *strDest = '\0'; -->即加一个结束符.因为字符串结束已拷贝了.
              return   address;      //返回目标首地址的值。            
               }

        //从上面的代码可以看出,strcpy函数,假定strDest的内存空间是足够可以放下strSrc的内容的.
        //也就是说使用者,在使用strcpy函数时,应使 (strDest内存空间)>=  (strSrc内存空间)     
        // 在调用   strcpy(dest,str);  时,while((*strDest++   =   *strSrc++)!='\0')   没有判断strDest的内存是否够,而是将srtSrc的内容直接拷贝到strDest,当拷到'\0'就结束.
        //因此在使用printf("%s\n",dest);  时 输出遇到'\0'时停此输出.所以会输出: Hello

    (4) 三者区别                    
           memset   主要应用是初始化某个内存空间。                  
           memcpy   是用于copy源空间的数据到目的空间中。                  
           strcpy   用于字符串copy,遇到‘\0’,将结束。                  
如果理解了这些,就能知道它们的区别:                 
       例如初始化某块空间的时候,用到memcpy,那么就显得笨拙                 
    int    m[100]                     
memset((void*)m,0x00,sizeof(int*100);             //Ok!                     
memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100);    //Not Ok
一.函数原型   
    strcpy    extern char *strcpy(char *dest,char *src);   
    #include <string.h>   
   功能:把src所指由NULL结束的字符串复制到dest所指的数组中   
   说明:  src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。   返回指向dest的指针   
    memcpy   extern void *memcpy(void *dest,void *src,unsigned int count);  
    #include <string.h>   
    功能:由src所指内存区域复制count个字符串到dest所指内存区域.   
    说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.      
    memset    extern void *memset(void *buffer,int c,int count);   
    #include <string.h>   
    功能:把buffer所指内存区域的前count个字节设置成字符c   
   说明:返回指向buffer的指针.
  二.区别   

memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '或者'\0';     
           例: char a[100];           memset(a,'\0',sizeof(a));        
memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度;   
             例:       char a[100],b[50];            
                       memcpy(b,a,sizeof(b));   
   //注意:如果使用sizeof(a),会造成内存溢出            
   mem是一段内存,他的长度,必须自己记住.memcpy是见着什么拷贝什么。         
strcpy 就只能拷贝字符串,它遇到'\0'就结束拷贝;      
            例:char a[100],b[50];               strcpy(a,b);              
            如用strcpy(b,a)要注意a中的字符串长度(第一个'\0'之前) 是否超过50,如果超过,则会造成b的   内存溢出.
      它是不会拷贝'\0'的,所以一般还有加一个语句:               *a='\0';   
三.使用技巧  

  memset 可以方便的清空一个数据结构的变量或数组.      
        如:         struct sample_struct  {  
                                  char   csName[16];               
                                  int      iSeq;              
                                  int       iType;        
                                    };        
       对于变量        
        struct sample_struct   stTest;        
                一般情况下,初始化stTest的方法:         
                         stTest.csName[0]='\0';         
                         stTest.iSeq=0;         
                         stTest.iType=0;     
         而用memset:        
                 memset(&stTest,0,sizeof(struct sample_struct));   
                    如果是数组:     
                     struct sample_struct   TEST[100];     
                     memset(TEST,0,sizeof(struct sample_struct)*100);
别再只用DataParallel了!PyTorch DDP分布式训练保姆级配置指南(含launch启动与避坑点) 本文详细介绍了PyTorch DDP分布式训练的配置指南,从DataParallel到DistributedDataParallel的技术迁移路径,重点解决显存利用不均、性能瓶颈等关键问题。通过实战案例和代码示例,帮助开发者掌握DDP的核心配置、数据加载优化及常见故障排查技巧,显著提升训练效率和稳定性。 阅读详情

相关推荐

C++面向对象之对象的初始化和清理

如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造。来解决上述问题,这两个函数将会被编译器自动调用,完成对象的初始化和清理工作。4、程序在调用对象的时候会自动调用构造,无须手动,而且只会调用一次。4、程序在对象销毁的时候会自动调用析构,无须手动,而且只会调用一次。C++类中的成员可以是另一个类的对象,我们称该成员为对象成员。那么当创建B对象时,A与B的构造和析构的顺序是谁先谁后?注意:构造顺序:先构造A的对象,再构造B类(当其他。作为本类成员,构造时候先构造类对象,再构造自身,)

m0_63520910的博客 585

c++ 中的memset与memcpy函数

1.memset函数 memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的; 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化; 原型为 : void *memset(void *s, int v, size_t n); 这里s可以是数组名,也可以是指向某一内在空间的指针; v为要填充的值; n为要填充的字节数; 例: s...

weixin_43444901的博客 971

Isaac Lab强化学习实战:用SO-ARM101机械臂实现抓取任务(附B站视频教程)

本文详细介绍了如何使用Isaac Lab强化学习框架,在SO-ARM101机械臂上实现抓取任务的完整实战流程。内容涵盖从环境搭建、奖励函数设计、训练调参到模型部署的各个环节,并分享了Sim-to-Real迁移的关键技巧,旨在帮助开发者高效完成机器人强化学习项目。

weixin_29070721的博客 1101

C++中的内存操作之memset和memcpy

在可能的情况下,使用适当的 C++ 构造函数和赋值运算符总是更安全和更表达性的选择,低级函数 memset 和 memcpy虽然功能强大,但是使用不当会导致内存级别的错误。

xcinkey的博客 1788

从零到一:手把手部署用友T3标准版11.2及SQL Server 2008R2环境

本文详细介绍了从零开始部署用友T3标准版11.2及SQL Server 2008R2环境的完整流程,包括环境准备、SQL Server安装、环境检测与修复、T3标准版安装实战以及初始化配置与测试。通过手把手的步骤指导和常见问题解决方案,帮助用户顺利完成部署,确保系统稳定运行。

weixin_28339967的博客 454

BQ40Z50R2循环学习实战:量产文件生成与关键状态位解析

本文详细解析了TI BQ40Z50R2电量计循环学习(Golden Learning)的实战流程与量产文件生成方法。重点剖析了updateStatus状态位在充放电静置阶段的常见异常(如卡在0x04或跳至0x0E)及其根本原因,并提供了从环境控制、命令顺序到文件处理的完整避坑指南,帮助工程师高效完成量产配置。

weixin_29170327的博客 214

Memset、Memcpy、Strcpy 的作用和区别(转)

<br />(1) Memset<br />  原型:   extern void *memset(void *buffer, int c, int count);              <br />  用法:   #include <string.h>           <br /> 功能:   把buffer所指内存区域的前count个字节设置成字符 c。           <br />  说明:   返回指向buffer的指针。用来对一段内存空间全部设置为某个字符<br />  例如:    

borise123456的专栏 778

DFT知识点扫盲——DFT scan chain

实际在项目中synccell一般直接上ULVT,既然是SDF,就是带Scan接口的DFF,SN (set negtive)是低置位,RP(reset positive)是高复位,既没有SN也没有RP的就是无复位寄存器。1:定义:满足可测试性设计(DFT),将设计中所有的触发器连接到一条或者若干条链上,称为scan chain,将一个复杂的时序电路转换为简单的组合电路进行测试,这一步是在逻辑综合(DC)中实现。当SE=1当SI=1时,电路进入scan状态,当SI=0时,电路工作在normal状态。

笨蛋大乌龟的博客 4935

memset,memcpy,strcpy 的区别

一.函数原型   strcpy   extern char *strcpy(char *dest,char *src);   #include    功能:把src所指由NULL结束的字符串复制到dest所指的数组中   说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。   返回指向dest的指针  memcpy  extern void *memcpy

4784

195、大模型蒸馏与压缩:知识蒸馏与VLA模型轻量化

折腾完这一整套流程,最大的感悟是:知识蒸馏不是简单的模型压缩,而是知识迁移的工程艺术。每一步都有坑,每个参数都可能影响最终性能。给后来者的建议是:先别急着上蒸馏,把teacher模型的推理延迟和显存占用测清楚,确定瓶颈在哪里——是计算量太大还是内存带宽不够,这决定了你该用蒸馏还是量化还是剪枝。蒸馏训练时一定要监控每一层的特征对齐loss,别只看总loss。如果某一层的对齐loss特别高,说明student在这一层学歪了,需要调整该层的损失权重或者增加该层的投影头容量。

sundong_81的博客 111

微信支付PHP集成指南

完整实现建议参考微信支付官方文档,包含更多支付场景(H5支付、Native支付等)和安全性处理细节。微信支付在PHP中的集成主要涉及服务端接口的调用和支付流程的实现。

bqq506615054的专栏 156

memset,memcpy,strcpy的区别

memset,memcpy,strcpy的区别 一.函数原型    strcpy    extern char *strcpy(char *dest,char *src);    #include    功能:把src所指由NULL结束的字符串复制到dest所指的数组中    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。    返

YUZHIBOYI的专栏 1327

即插即用系列(代码实践) | CVPR 2025 FDConv:频域动态卷积,打破密集预测任务的参数效率瓶颈

本文提取自 CVPR 2025 的最新底层算子革新论文《Frequency Dynamic Convolution for Dense Image Prediction》。近年来,动态卷积(Dynamic Convolution)通过融合多个并行卷积核极大地提升了模型性能,但研究表明:这些并行卷积核在频域上的响应高度相似,导致了极其严重的参数浪费,且缺乏对不同频率特征的自适应能力。本文复现了该网络的核心架构——FDConv(频率动态卷积)。该方案创造性地在傅里叶域(Fourier Domain)中学习固定参

分享顶会顶刊论文即插即用模块 111

strcpy,memcpy和memset的区别

strcpy函数的原型:char* strcpy(char* dest, const char* src); memcpy函数的原型:void *memcpy( void *dest, const void *src, size_t count ); memset函数的原型:memset(void *s, int ch,size_t n); strcpy,memcpy和memset主要...

矢月的博客 1459

第三天:Python基础语法详解

Python代码规范与注释最佳实践 摘要: 本文深度解析Python缩进规则与代码结构的技术规范,包括缩进的底层原理、语法规则和错误处理。详细阐述Python注释系统,涵盖行内注释、文档字符串和类型注释等多种形式,并提供工业级代码组织方案。研究显示,良好的缩进可提升40%的代码识别速度,降低50%的认知负荷。文章还对比了Sphinx、pdoc等主流文档生成工具,给出企业级项目中的注释编写原则和模板建议,帮助开发者构建更可维护的Python代码。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1011

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++:memset ,memcpy 和strcpy 的根本区别(转)

转自:https://blog.youkuaiyun.com/stock888/article/details/3930847 C++:memset ,memcpy 和strcpy 的根本区别(转) #include "memory.h" memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', siz...

qq_37871669的博客 237

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

memset ,memcpy 和strcpy 的根本区别

转自: http://afreez.blog.51cto.com/59057/7349 声明: 以下内容为网络整理的结果! 它们用处不同,但大部分情况下可以完成相同的要求。 strcpy 原型:extern char *strcpy(char *dest

玲玲的专栏 914

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

memset ,memcpy 和strcpy 的根本区别?

http://www.cppblog.com/junfeng568/archive/2006/03/11/4022.html Memset  用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’; 例:char a[100];memset(a, '\0', sizeof(a));      memset可以方便的清空一个结构类型的变量或数组。

JUNGOU1的专栏 425

memset ,memcpy,strcpy作用与区别

memset   主要应用是初始化某个内存空间。                   memcpy   是用于copy源空间的数据到目的空间中。                   strcpy   用于字符串copy,遇到‘\0’,将结束。 一、 strcpy       strcpy    extern char *strcpy(char *dest,char *src);

1062
上一篇: 人生如同故事 重要的并不在于有多长 而是在于有多好
下一篇: 在win7下搭建cocos2d-x v3.2rc0开发环境(For Android)
Beyond我爱杨
博客等级 码龄13年 36粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值