memcpy的用法

原型:

void *memcpy(void *dest, const void *src, size_t n);

 

功能:

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

 

C++头文件

#include<cstring>

 

说明:

1、由于函数的实参是void*,所以可以拷贝任意的类型对象

2、srcdest所指的内存可能重叠,但是如果srcdest所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。

3、如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

4、首先要判断指针的值不能为空,desc为空的话肯定不能拷贝内存空间,src为空相当于没有拷贝;所以之间return掉;

5、""空串是指内容为0NULL0,不是串;两个不等价;

6、int dest[2] = {0};这是对int 类型的数组初始化的方法;如果是char类型,就用char a[5] = "1234";  注意数组下标要 多于实际看到的字符数,因为还有'/0'

7、memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),这个是包括字符串的结束符'/0'的;所以不用担心printf(dest); 但是如果用memcpy1(dest,src,4);没有'/0'就要*(dest+5) = '/0';这样保证是一个完整的字符串;

8、如果初始化的时候:char dest[1024] = "12345666";//{0}; const char src[5] = "3333";

那么拷贝的时候,如果用memcpy1(dest,src,sizeof(src));

printf(dest);出来是3333如果memcpy1(dest,src,4);printf(dest);出来是33335666;因为上面的sizeof(src),包含'/0',所以拷贝过去的字符串以'/0',结束,就只有3333,而如果传4个字符,'/0'是第五个字符,那就遇到dest[1024] '/0'结束,所以是33335666


[cpp]  view plain  copy
  1. // 字符转换.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "iostream"  
  6. #include"string"  
  7. #include"sstream"  
  8. using namespace std;  
  9. //#pragma warning(disable : 4996)  
  10.   
  11.   
  12. struct STUDENT  
  13. {  
  14.     char _name[32];  
  15.     int _age;  
  16.     bool _gender;  
  17. };  
  18. STUDENT a = { "Li Lei", 20, true };  
  19. STUDENT b = { "Han MeiMei", 19, false };  
  20. int len = sizeof(STUDENT);  
  21. int _tmain(int argc, _TCHAR* argv[])  
  22. {  
  23.     char buffer[128] = { 0 };  
  24.     char* p = buffer;  
  25.     int bufferLen = 0;//数据长度  
  26.     int num1 = 100;  
  27.     int num2;  
  28.     //数据打包  
  29.     memcpy(p,&a,sizeof(a));  
  30.     p += sizeof(a);  
  31.     bufferLen += sizeof(a);  
  32.   
  33.     memcpy(p, &num1, sizeof(num1));  
  34.     p += sizeof(num1);  
  35.     bufferLen += sizeof(num1);  
  36.   
  37.     memcpy(p, &b, sizeof(b));  
  38.     p += sizeof(b);                  
  39.     bufferLen += sizeof(b);  
  40.       
  41.       
  42.   
  43.     //解析  
  44.     STUDENT c;  
  45.     STUDENT d;  
  46.     memcpy(&c, buffer, sizeof(STUDENT));  
  47.       
  48.     memcpy(&num2, buffer + sizeof(STUDENT), sizeof(int));  
  49.       
  50.     memcpy(&d, buffer + sizeof(STUDENT)+sizeof(int), sizeof(STUDENT));  
  51.   
  52.     cout << c._name << " "<<c._age<<" "<<c._gender<<endl;  
  53.     cout << num2 << endl;  
  54.     cout << d._name << " " << d._age << " " << d._gender << endl;  
  55.     system("pause");  
  56.     return 0;  
  57.       
  58. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值