鱼C论坛

 找回密码
 立即注册
查看: 7987|回复: 6

[函数快查] memcpy -- 拷贝内存空间

[复制链接]
发表于 2016-12-16 16:26:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
memcpy 函数文档


函数概要:

memcpy 函数从 src 指向的内存空间拷贝 n 个字节到 dest 指向的内存空间。src 和 dest 指向的内存区域不能出现重叠,否则应该使用 memmove 函数。

memcpy 函数并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。


函数原型:

  1. #include <string.h>
  2. ...
  3. void *memcpy(void *dest, const void *src, size_t n);
复制代码


参数解析:

参数 含义
dest指向目标内存空间
src指向源内存空间
n指定要拷贝到 dest 指向空间的前 n 个字节


返回值:

返回 dest 指向的内存空间。


演示:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(void)
  5. {
  6.         char str[] = "I love FishC.com!";
  7.         char *ptr;
  8.         int length = sizeof(str);

  9.         printf("length = %d\n", length);

  10.         ptr = (char *)malloc(length * sizeof(char));
  11.         if (ptr == NULL)
  12.         {
  13.                 exit(1);
  14.         }

  15.         memset(ptr, 0, length);
  16.         memcpy(ptr, str, length);

  17.         printf("%s\n", ptr);

  18.         return 0;
  19. }
复制代码

搜狗截图20161216225048.png

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
wanting-for + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-8 10:47:10 | 显示全部楼层
为什么有两个printf函数只打印了一句话?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 13:45:42 | 显示全部楼层
  1. int main(void)
  2. {
  3.     char s[] = "hello world";
  4.     int len = strlen(s);
  5.     char* ptr = (char *)malloc((len + 1)*sizeof(char));
  6.     if (!ptr)
  7.     {
  8.         exit(1);
  9.     }
  10.     ptr = (char*)memcpy(ptr, s, len+1);
  11.    
  12.     while (*ptr)
  13.     {
  14.         printf("%c ", *ptr++);
  15.     }
  16.    
  17.    
  18.     putchar('\n');
  19.     return 0;
  20. }
复制代码

我觉得这里并不应该是单纯的长度来进行拷贝,应该是长度加 1 ,最后还有一个 ‘\0’ ,来标志结束,如果单纯的长度会导致最后一个'\0',会导致最后的那个0未拷贝;造成错误;
如有错误,请提醒我哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-7 16:59:20 | 显示全部楼层
小甲鱼这里应该是出现了一点纰漏,因为mencpy是按照字符分配内存的,所以
  1. memset(ptr, 0, length);
  2. memcpy(ptr, str, length);
复制代码

这两句的最后一个参数应该不是length,而是length*sizeof(int)否则会出现错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-10-16 09:52:19 | 显示全部楼层
本帖最后由 Lowell 于 2020-10-16 09:56 编辑
shatanzongcai 发表于 2020-6-7 16:59
小甲鱼这里应该是出现了一点纰漏,因为mencpy是按照字符分配内存的,所以

这两句的最后一个参数应该不是 ...


#include <string.h>
  void *memcpy( void *to, const void *from, size_t count );


功能:函数从from中复制count 个字符到to中,并返回to指针。
因为 size_t 就是 unsigned int ,即memcpy按照字节个数进行复制!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 19:55:35 | 显示全部楼层
wanting-for 发表于 2020-2-27 13:45
我觉得这里并不应该是单纯的长度来进行拷贝,应该是长度加 1 ,最后还有一个 ‘\0’ ,来标志结束,如果单 ...

你用的是strlen,小甲鱼用的是sizeof好不好?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-18 19:36:05 | 显示全部楼层
这个是不是应该学完小甲鱼指真再来学?看完字符串学这个,就算有点学校学的基础也看得一愣一愣的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表